2016-06-04 7 views
1

У меня возникла странная проблема. У меня есть DataGrid, который я хочу связать с ItemsSource с MultiBinding. При использовании простой привязки к DataTable хорошо работает, я не могу заставить это работать с многосвязным.Невозможно связать DataGrid ItemsSource с многосвязным - простое связывание прекрасно работает

Проще говоря: разметку ниже работ и предоставляет данные таблицы

<DataGrid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" AutoGenerateColumns="True" IsReadOnly="True"> 
    <DataGrid.ItemsSource> 
     <Binding Path="Mock.Value" Converter="{StaticResource CollectionToDataTableConverter}"></Binding> 
    </DataGrid.ItemsSource> 
</DataGrid> 

... в то время как это на самом деле не работает - не оказывает никакого отношения

<DataGrid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" AutoGenerateColumns="True" IsReadOnly="True"> 
    <DataGrid.ItemsSource> 
     <MultiBinding Converter="{StaticResource CollectionToDataTableConverter}"> 
      <Binding Path="Mock.Value" /> 
     </MultiBinding> 
    </DataGrid.ItemsSource> 
</DataGrid> 

Обратите внимание, что CollectionToDataTableConverter реализует как IValueConverter и IMultiValueConverter и просто передает значение

public class CollectionToDataTableConverter : IMultiValueConverter, IValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return values?.FirstOrDefault(); 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
    // ... 
} 

На данный момент существует модель Mock.Value и модель DataTable. Кроме того, отладка доказывает, что в обоих случаях конвертер возвращает правильное значение.

У вас есть идеи, что с этим связано?

Спасибо!

ответ

2

Прежде всего, DataTable не реализует IEnumerable, поэтому это недопустимое значение для DataGrid.ItemsSource. Вы можете увидеть System.Windows.Data Error: 5 в окне вывода, в котором говорится именно об этом.

Во-вторых, вы можете легко проверить, что окончательное значение DataGrid.ItemsSource при привязке к DataTable фактически DataView объект (именно это значение DataTable.DefaultView имущества).

В настоящее время существует несколько способов сделать MultiBinding работу - вот пара:

  • Верните DataTable.DefaultView, а не DataTable себя в конверторе
  • Bind непосредственно к DataTable.DefaultView (используйте Mock.Value.DefaultView, как обязательный путь)
  • Создайте класс, полученный из DataTable и реализующий IEnumerable (возврат DefaultView.GetEnumerator() в реализации GetEnumerator), и используйте этот класс вместо DataTable

Что касается объяснения, как это делает автомагически работы, когда не используется MultiBinding или почему это не тот случай, когда с помощью одного - я не знаю. Я думал, что это механизм преобразования типов WPF, но преобразователи по умолчанию ни для DataTable, ни для IEnumerable не способны выполнить преобразование, поэтому я думаю, что это не так. Возможно, класс Binding обладает некоторыми специальными возможностями по этому вопросу, что MultiBinding этого не делает.

+0

Благодарим вас за ответ. Наилучшим образом, самый легкий для меня - вернуть '.DefaultView' в этом случае. И это, по-видимому, делает работу с несколькими связями правильной. Спасибо, очень хорошо поймать! – patryk