WPF MVVMLight:基于另一个DataGrid的SelectedItem更新DataGrid
使用MVVMLight
开发WPF
应用程序。
我的Model
由一个Attribute
类和一个DataSet
类组成,其中一个名为Attributes
的ObservableCollection
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将第二个DataGrid
的ItemsSource
设置为SelectedAttribute
并创建一个绑定到SelectedAttribute
的Categories
属性的列,它是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] }); }
然后绑定到您的网格。