我有一个数据网格绑定到一个包含不同类型项目列表的类 选择datagrid1中的项目时,所选项目中的列表应显示在datagrid2中。
有没有直接的方法呢?
到目前为止,我一直在尝试在SelectedItemsCollection.CollectionChanged事件处理程序中执行此操作,但在我看来可能有办法通过数据绑定(在xaml中或在ViewModel中以编程方式)。
答案 0 :(得分:1)
将第一个DataGrid的SelectedItem属性绑定到视图模型的source属性:
<DataGrid x:Name="dataGrid1" SelectedItem="{Binding MySelectedItem}" />
private YourType _selectedItem;
public YourType MySelectedItem
{
get { return _selectedItem;; }
set { _selectedItem; = value; NotifyPropertyChanged(); }
}
...以及第二个DataGrid的ItemsSource属性到第一个中选择的项的子属性:
<DataGrid x:Name="dataGrid2" ItemsSource="{Binding MySelectedItem.TheCollectionProperty}" />
确保您的视图模型类实现了INotifyPropertyChanged,并在设置“MySelectedItem”源属性时引发PropertyChanged事件:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx
这是使用MVVM设计模式的方法。
您还可以将第二个DataGrid的ItemsSource属性直接绑定到第一个DataIrid的SelectedItem属性,如下所示:
<DataGrid x:Name="dataGrid2" ItemsSource="{Binding SelectedItem.TheCollectionProperty, ElementName=dataGrid1}" />
请注意,要使此示例代码在第一个DataGrid中处理项目的类型,即上面示例代码中的“YourType”,必须有一个名为“TheCollectionProperty”的公共属性,它返回您想要的IEnumerable项目显示在第二个DataGrid中。
答案 1 :(得分:0)
如果您使用CollectionViewSource,则可以绑定到CurrentItem
属性(使用&#34; \&#34;运算符)和IsSynchronizedWithCurrentItem="True"
使用ListView的示例
<DockPanel >
<DockPanel.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding ItemCollection}" />
</DockPanel.Resources>
<TextBox Text="{Binding Path=/field1,Mode=OneWay, Source={StaticResource cvs}}" DockPanel.Dock="Bottom"/>
<ListView ItemsSource="{Binding Mode=OneWay, Source={StaticResource cvs}}" IsSynchronizedWithCurrentItem="True">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding field1}" Header="Feild1"/>
<GridViewColumn DisplayMemberBinding="{Binding field2}" Header="Field2"/>
<GridViewColumn DisplayMemberBinding="{Binding field3}" Header="Field3"/>
<GridViewColumn DisplayMemberBinding="{Binding field4}" Header="Field4"/>
</GridView>
</ListView.View>
</ListView>
</DockPanel>
这也具有解锁高级排序,分组和过滤功能的效果