Как создать список отображения CollectionViewSource в DataGrid

У меня есть 3 сетки данных. Вторая и третья сетки данных должны отображать только подмножество значений из первой сетки данных на основе выбранной строки в первой сетке данных.

C#:

_context.MyFor.Load();
F = new ObservableCollection<DB.Forum>(_context.MyFor.Local);

В XAML я определяю ресурсы:

<Window.Resources>
    <CollectionViewSource Source="{Binding F}" x:Key="CVSF" x:Name="CVSF" />
    <CollectionViewSource Source="{Binding FUsers, Source={StaticResource CVSF}}" x:Key="CVSUsers" x:Name="CVSUsers" />
    <CollectionViewSource Source="{Binding FOptions, Source={StaticResource CVSF}}" x:Key="CVSOptions" x:Name="CVSOptions" />
</Window.Resources>

Привязка делается так:

// Datagrid 1:
<DataGrid ItemsSource="{Binding Source={StaticResource CVSF}}" />

// Datagrid 2:
<DataGrid ItemsSource="{Binding Source={StaticResource CVSUsers}}">
   <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding User.UserUsername}" Header="UserName" x:Name="UserCol2" />
   </DataGrid.Columns>
</DataGrid>

// Datagrid 3:
<DataGrid ItemsSource="{Binding Source={StaticResource CVSOptions}}" PresentationTraceSources.TraceLevel="High" >
   <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding CountryName}" Header="Country1" />
      <DataGridTextColumn Binding="{Binding Country.CountryName}" Header="Country2" />
      <DataGridTextColumn Binding="{Binding ForumOptions.Country.CountryName}" Header="Country3" />
   </DataGrid.Columns>
</DataGrid>

Проблема: первый датагрид показывает все. Второй показывает только тех пользователей, которые принадлежат выбору первой сетки данных (как и ожидалось). Но третий datagrid ничего не показывает (см. ошибку ниже). Я предполагаю, что это потому, что возврат является объектом (а не CollectionView).

System.Windows.Data Error: 5 : Value produced by BindingExpression 
is not valid for target property.;
Value='System.Data.Entity.DynamicProxies.ForumOptions_0DF21D7'
BindingExpression:Path=ForumOptions; 
DataItem='ListCollectionView' (HashCode=34116599); 
target element is 'CollectionViewSource' (HashCode=62307935); 
target property is 'Source' (type 'Object')

Как отобразить связанные результаты в третьей сетке данных?


person David S    schedule 17.04.2014    source источник
comment
Имеют ли элементы FOptions свойства CountryName, Country и ForumOptions?   -  person Hamlet Hakobyan    schedule 17.04.2014
comment
Да, это имеет. Я думаю, что проблема кроется где-то в несоответствии типов. Например, вторая сетка данных работает нормально, потому что FUsers возвращает коллекцию, однако FOptions возвращает только объект и конфликтует с ресурсом CollectionViewSource. Я просто не знаю, как это решить.   -  person David S    schedule 17.04.2014


Ответы (1)


Наконец удалось найти решение. Вместо привязки к отдельному CollectionViewSource я назвал первую сетку данных как x:Name="FList", а затем использовал привязку к ElementName=FList, Path=SelectedItem, а затем определил Путь к нужному свойству.

<StackPanel DataContext="{Binding ElementName=FList, Path=SelectedItem, Mode=TwoWay}" Name="StackPanel2" >
    <TextBox Text="{Binding Path=ForumOptions.Country.CountryName}"/>
</StackPanel>
person David S    schedule 24.04.2014