使用WPF
开发MVVMLight
应用。
我的Model
由Attribute
类和DataSet
类组成,其中ObservableCollection<Attribute>
属性名为Attributes
。
我的MainViewModel
有一个DataSet
属性。
在我MainView
DataContext
设置为MainViewModel
的{{1}}中,我有两个DataGrids
。其中一个ItemsSource
绑定到DataSet.Attributes
,效果很好:
<DataGrid CanUserAddRows="false" AutoGenerateColumns="false" ItemsSource="{Binding DataSet.Attributes}">
//some DataGrid columns here
我希望第二个DataGrid
根据第一个DataGrid的SelectedItem
显示一些其他属性,因此我执行了以下操作:
1)在我的SelectedAttribute
中添加了Attribute
类型的MainViewModel
属性:
private Attribute selectedAttribute;
public Attribute SelectedAttribute
{
get { return selectedAttribute; }
set
{
if (selectedAttribute == value)
{
return;
}
selectedAttribute = value;
RaisePropertyChanged(() => SelectedAttribute);
}
}
2)修改了我的第一个DataGrid
以将其SelectedItem
绑定到SelectedAttribute
:
<DataGrid CanUserAddRows="false" AutoGenerateColumns="false" ItemsSource="{Binding DataSet.Attributes}" SelectedItem="{Binding SelectedAttribute}">
3)更新1 将第二个ItemsSource
的{{1}}设置为DataGrid
并创建一个绑定到SelectedAttribute
属性的列{ {1}} Categories
:
SelectedAttribute
4)在我的ObservableCollection<string>
中,填充<DataGrid SelectionMode="Single" EnableColumnVirtualization="True" AutoGenerateColumns="false" ItemsSource="{Binding Main.SelectedAttribute}">
<DataGrid.Columns>
<DataGridTextColumn Header="categories" Width="auto" Binding="{Binding Main.SelectedAttribute.Categories}" />
</DataGrid.Columns>
</DataGrid>
后,我将MainViewModel
设置为集合中的第一个DataSet.Attributes
(就像测试一样):
SelectedAttribute
运行此操作后,第一个Attribute
加载正常,但没有选择任何项目,第二个SelectedAttribute = DataSet.Attributes[0];
没有显示任何内容。我做错了什么?
答案 0 :(得分:1)
网格的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<SomeGridItem> 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]
});
}
然后绑定到您的网格。
<DataGrid SelectionMode="Single" EnableColumnVirtualization="True" AutoGenerateColumns="false" ItemsSource="{Binding Main.Blahs}">
<DataGrid.Columns>
<DataGridTextColumn Header="categories" Width="auto" Binding="{Binding Category}" />
<DataGridTextColumn Header="categories" Width="auto" Binding="{Binding SecondProp}" />
<DataGridTextColumn Header="categories" Width="auto" Binding="{Binding ThirdProp}" />
</DataGrid.Columns>
</DataGrid>