如何使CollectionViewSource在DataGrid上显示List

时间:2014-04-17 12:43:09

标签: c# wpf data-binding datagrid collectionviewsource

我有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>

问题:第一个数据网格显示了所有内容。其次仅显示属于第一个数据网格选择的用户(如预期的那样)。 但是第三个数据网格什么都没有显示(参见下面的错误)。我想这是因为返回是一个Object(不是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')

如何在第三个数据网格上显示相关结果?

1 个答案:

答案 0 :(得分:0)

最后设法找到溶剂。我没有绑定到单独的CollectionViewSource,而是将第一个数据网格命名为 x:Name =&#34; FList&#34; ,然后使用绑定到 ElementName = FList,Path = SelectedItem 然后将路径定义为所需的属性。

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