Связывание 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, либо полностью ее пропустить.

0
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

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

Спасибо. Было интересно, можно ли избежать создания нескольких списков, но я думаю, что это способ сделать это :)

Stephan Fuhlendorff 31.10.2018 12:51

@StephanFuhlendorff Даже если вы не собираетесь проходить весь маршрут MVVM, обычно проще и чище разделить U.I. из любой логики данных.

Peregrine 31.10.2018 13:02

Конечно. Я просто боялся, что позже это вызовет проблемы при попытке редактировать каналы, поэтому я пытался сохранить их вместе как можно дольше :)

Stephan Fuhlendorff 31.10.2018 13:08

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