Условное мультисвязывание DataGrid в WPF - PullRequest
0 голосов
/ 14 мая 2019

У меня есть DataGrid в окне WPF, чьи itemsSource могут отличаться в зависимости от условия. если условие истинно, itemsSource устанавливается в список объектов типа classA, в противном случае устанавливается в список объектов типа classB. В DatagridColumns у меня есть некоторые DataGridTextColumn, которые должны быть связаны с членами classA или classB на основе типа itemsSource.

<DataGrid  x:Name="MyDataGrid">
    <DataGrid.Columns >
        <DataGridTextColumn Header="Title">
             <DataGridTextColumn.Binding>
                  <MultiBinding>
                       <Binding Path= "MemberOfClassA"/>
                       <Binding Path= "MemberOfClassB"/>
                 </MultiBinding>
             </DataGridTextColumn.Binding>
          </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

В моем коде C # у меня есть:

ClassA
{
    public string MemberOfClassA {get;set;}
    ...
}
ClassB
{
    public string MemberOfClassB {get;set;}
    ...
}

List<ClassA> listA = ...;
List<ClassB> listB = ...;

MyDataGrid.ItemsSource = condtion? listA : listB;

Как реализовать преобразователь для MultiBinding для выбора пути привязки в зависимости от условия. Любое альтернативное предложение также будет оценено.

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Я нашел этот конвертер полезным:

 public class CellConverter : IMultiValueConverter
{
    public object Convert(
        object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        foreach(object value in values)
        {
            if (value == DependencyProperty.UnsetValue)
                continue;
            else
                return value;
        }
        return null;
    }       

    public object[] ConvertBack(
        object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

}

и в файле XAML:

<MultiBinding  Converter="{StaticResource CellConverter}">
     <Binding Path="MemberOfClassA"/>
     <Binding Path="MemberOfClassB"/>
</MultiBinding>

Хотя для ItemsSource задан только один из типов, для другого типа значенияне будет установлен.поэтому возвращаемое значение будет иметь тип DependencyProperty.UnsetValue, и преобразователь просто возвращает ожидаемое значение.

Редактировать

как @EdPlunkett, упомянутый в комментариях, в этом методезначения нельзя редактировать в DataGrid, поэтому это полезно только для столбцов, доступных только для чтения.Для редактируемых столбцов лучше добавить несколько DataGridTextColumn для каждого типа и связать их свойство Visibility с преобразователем значений.

1 голос
/ 14 мая 2019

Если столбцы таблицы данных будут другими, изменение привязки столбцов будет довольно грязным.

Вы можете создать два пользовательских элемента управления с сеткой данных в каждом. Предоставляя вам сетку данных, подходит каждому.

Переключите содержимое элемента управления контентом на соответствующий.

Либо с помощью селектора dateatemplateselector, либо поместив две коллекции в два разных типа модели представления и используя тип данных, чтобы выбрать соответствующий пользовательский элемент управления в качестве матрицы данных.

...