Привязка 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.

Другие вопросы по тегам