将datagrid绑定到其他datagrid中所选项的属性

时间:2016-12-12 15:32:07

标签: wpf data-binding wpfdatagrid

我有一个数据网格绑定到一个包含不同类型项目列表的类 选择datagrid1中的项目时,所选项目中的列表应显示在datagrid2中。

有没有直接的方法呢?
到目前为止,我一直在尝试在SelectedItemsCollection.CollectionChanged事件处理程序中执行此操作,但在我看来可能有办法通过数据绑定(在xaml中或在ViewModel中以编程方式)。

2 个答案:

答案 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>

这也具有解锁高级排序,分组和过滤功能的效果