Привязка DataGridColumn, только если свойство объекта имеет значение true
В настоящее время я сталкиваюсь с проблемой при попытке сделать некоторую условную привязку в WPF. Я прочитал об этой проблеме, и кажется, что "видимость" на самом деле не вариант для DataGridColumns, так как его нет в логическом дереве. В настоящее время у меня есть объект "Устройство", который содержит список объектов "Канал". Эти каналы могут быть как входными, так и выходными, которые представлены как bool "isInput". Я пытаюсь создать две сетки данных, одну с входными данными и одну с выходными данными.
<DataGrid Grid.Row="0" AutoGenerateColumns="False" ItemsSource="{Binding Path=Channels}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Type}"
Visibility="{Binding Path=(model:Channel.IsInput),
Converter={StaticResource BooltoVisibilityConverter}}"/>
</DataGrid.Columns>
</DataGrid>
Это то, что у меня есть на данный момент, но поскольку видимость не работает, я хотел бы либо скрыть всю строку, когда IsInput=false, либо пропустить ее полностью.
1 ответ
Если вам нужно несколько сеток, вам нужно отфильтровать несколько коллекций элементов, как требуется.
Для того, что вам нужно, предполагая, что общее количество объектов канала относительно мало, я бы сделал что-то вроде этого.
public class ViewModel: ViewModelBase
{
public ViewModel()
{
AllChannels = new ObservableCollection<Channel>();
AllChannels.CollectionChanged += (s,e) =>
{
RaisePropertyChanged(nameof(InputChannels));
RaisePropertyChanged(nameof(OutputChannels));
}
}
private ObservableCollection<Channel> AllChanels { get; }
public IEnumerable<Channel> InputChannels => AllChannels.Where(c => c.IsInput);
public IEnumerable<Channel> OutputChannels => AllChannels.Where(c => !c.IsInput);
public void AddChannel(Channel channel)
{
AllChannels.Add(channel);
}
}
Теперь вы можете создать два элемента управления сеткой и связать их свойство ItemsSource с InputChannels и OutputChannels.