Связывание DataGridColumn только в том случае, если свойство объекта истинно

В настоящее время я столкнулся с проблемой при попытке выполнить условную привязку в WPF. Я читал о проблеме, и мне кажется, что «видимость» на самом деле не вариант для DataGridColumns, поскольку ее нет в логическом дереве. В настоящее время у меня есть объект «Устройство», который содержит список объектов «Канал». Эти каналы могут быть как входными, так и выходными, что обозначается логическим значением 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, либо полностью ее пропустить.


person Stephan Fuhlendorff    schedule 31.10.2018    source источник


Ответы (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.

person Peregrine    schedule 31.10.2018
comment
Спасибо. Было интересно, можно ли избежать создания нескольких списков, но я думаю, что это способ сделать это :) - person Stephan Fuhlendorff; 31.10.2018
comment
@StephanFuhlendorff Даже если вы не собираетесь проходить весь маршрут MVVM, обычно проще и чище разделить U.I. из любой логики данных. - person Peregrine; 31.10.2018
comment
Конечно. Я просто боялся, что позже это вызовет проблемы при попытке редактировать каналы, поэтому я пытался сохранить их вместе как можно дольше :) - person Stephan Fuhlendorff; 31.10.2018