Binding.Converter к Visible DataGridTextColumn
Необходимо прибиндить конвертор к DataGridTextColumn.
DataGrid.ItemsSource прикреплен к:
private ObservableCollection<AppealModel> _dataTable;
public ObservableCollection<AppealModel> DataTable
{
get => _dataTable;
set => Set(ref _dataTable, value);
}
(в прикрепленно ViewModel соответственно)
XAML:
xmlns:converter="clr-namespace:appSend.Controllers.Converter"
<Page.Resources>
<converter:TableColumnVisibilityConverter x:Key="VisibilityConverter"/>
</Page.Resources>
<DataGrid ItemsSource="{Binding DataTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridTextColumn Header="Номер дела" Binding="{Binding Path=CaseNumber}"
Visibility="{Binding Path=ItemsSource, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource VisibilityConverter}, ConverterParameter=CaseNumber}"/>
<DataGridTextColumn Header="Короткое имя" Binding="{Binding Path=ShortName}"
Visibility="{Binding Path=ItemsSource, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource VisibilityConverter}, ConverterParameter=ShortName}"/>
</DataGrid.Columns>
</DataGrid>
описал без ненужных подробностей, все подключено как положено, ошибок нет, проект компилируется.
Converter:
public class TableColumnVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is not IEnumerable || parameter is not string propertyName || string.IsNullOrWhiteSpace(propertyName))
return Visibility.Hidden;
Type type = null;
PropertyInfo pi = null;
foreach (object item in (IEnumerable)value)
{
if (type is null)
{
type = item.GetType();
if (type.IsValueType)
return Visibility.Visible;
}
if (pi is null)
pi = type.GetProperty(propertyName);
if (pi.GetValue(item) is not null)
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException();
}