WPF MVVMLight:基于另一个DataGrid的SelectedItem更新DataGrid

使用MVVMLight开发WPF应用程序。

我的Model由一个Attribute类和一个DataSet类组成,其中一个名为AttributesObservableCollection Attributes

我的MainViewModel有一个DataSet属性。

在我的MainView ,它的DataContext设置为MainViewModel我有两个DataGrids 。 一个有它的ItemsSource绑定到DataSet.Attributes工作正常:

  //some DataGrid columns here 

我希望第二个DataGrid基于第一个DataGrid的SelectedItem显示一些其他属性,所以我做了以下内容:

1)在MainViewModel添加了Attribute类型的SelectedAttribute属性:

 private Attribute selectedAttribute; public Attribute SelectedAttribute { get { return selectedAttribute; } set { if (selectedAttribute == value) { return; } selectedAttribute = value; RaisePropertyChanged(() => SelectedAttribute); } } 

2)修改了我的第一个DataGrid ,将其SelectedItem绑定到SelectedAttribute

  

3) Update 1将第二个DataGridItemsSource设置为SelectedAttribute并创建一个绑定到SelectedAttributeCategories属性的列,它是ObservableCollection

      

4)在我的MainViewModel ,一旦填充了DataSet.Attributes ,我将SelectedAttribute设置为集合中的第一个Attribute (就像测试一样):

 SelectedAttribute = DataSet.Attributes[0]; 

一旦我运行它,第一个DataGrid加载正常,但没有选择任何项目,第二个DataGrid没有显示任何内容。 我究竟做错了什么?

网格的ItemsSource必须是IEnumerable。 所以这:

 ItemsSource="{Binding Main.SelectedAttribute}" 

将无法工作,因为SelectedAttribute是类的实例,而不是某种列表。

你也绑定了一些可能会将IEnumerable(类别)实现到DataTextColumn的东西,这也是错误的; 网格列的绑定必须是标量属性。

编辑:你不能直接将网格中的列绑定到三个单独的可观察集合; 你需要创建一个新的模型类来保存你想要在网格中显示的东西,比如:

 public class SomeGridItem { public string Category {get; set;} public string SecondProp {get; set;} public string ThirdProp [get; set;} } 

然后在视图模型上添加一个新属性 – 这是您将网格绑定到的内容:

 public ObservableCollection Blahs {get; set;} 

然后,当SelectedAttribute更改时,您将需要填充Blahs。 您可以在SelectedAttribute的属性设置器中执行此操作(可能最简单),或者您可以对SelectedAttribute的PropertyChanged事件做出反应。 这是伪代码,但它应该让你知道需要做什么。

 Blah.Clear(); for (var i = 0; i < SelectedAttribute.Categories.Count; i++) { Blahs.Add(new SomeGridItem() { Category = SelectedAttribute.Categories[i], SecondProp = SelectedAttribute.SecondCollection[i], ThirdProp = SelectedAttribute.ThirdCollection[i] }); } 

然后绑定到您的网格。