C# WPF MVVMLight:基于另一个DataGrid的SelectedItem更新DataGrid
使用C# WPF MVVMLight:基于另一个DataGrid的SelectedItem更新DataGrid,c#,.net,wpf,mvvm-light,wpfdatagrid,C#,.net,Wpf,Mvvm Light,Wpfdatagrid,使用MVVMLight开发WPF应用程序 我的模型由一个属性类和一个名为属性的可观察集合属性的数据集类组成 MyMainViewModel具有一个DataSet属性 在我的MainView中,它的DataContext设置为MainViewModel我有两个DataGrids。一个是将它的ItemsSource绑定到DataSet。属性工作正常: <DataGrid CanUserAddRows="false" AutoGenerateColumns="false" ItemsSource
MVVMLight
开发WPF
应用程序
我的模型
由一个属性
类和一个名为属性
的可观察集合
属性的数据集
类组成
MyMainViewModel
具有一个DataSet
属性
在我的MainView
中,它的DataContext
设置为MainViewModel
我有两个DataGrids
。一个是将它的ItemsSource
绑定到DataSet。属性
工作正常:
<DataGrid CanUserAddRows="false" AutoGenerateColumns="false" ItemsSource="{Binding DataSet.Attributes}">
//some DataGrid columns here
2) 修改了我的第一个DataGrid
以将其SelectedItem
绑定到SelectedAttribute
:
<DataGrid CanUserAddRows="false" AutoGenerateColumns="false" ItemsSource="{Binding DataSet.Attributes}" SelectedItem="{Binding SelectedAttribute}">
4) 在我的MainViewModel
中,一旦填充了DataSet.Attributes
,我将SelectedAttribute
设置为集合中的第一个属性(作为测试):
运行此命令后,第一个DataGrid
加载良好,但未选择任何项目,第二个DataGrid
不显示任何内容。我做错了什么?网格的ItemsSource必须是IEnumerable。因此:
ItemsSource="{Binding Main.SelectedAttribute}"
将不起作用,因为SelectedAttribute是类的实例,而不是某种列表
您还将可能实现IEnumerable(categories)的东西绑定到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;}
publicobservableCollection 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]
});
}
Blah.Clear();
对于(变量i=0;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>
SelectedAttribute是单个对象,您试图将其绑定到需要实现IEnumerable的数据源的数据网格。请尝试将SelectedAttribute设置为可观察的集合,并在代码中仅强制执行一项。嗨,paul,第二个DataGrid
的列实际上绑定到Attribute
的ObservableCollection
属性,请参阅上面的更新帖子。@paul abbott wa us,它有三列,分别表示属性(类别
&2更多)的三个可观察集合
属性。这就是我试图将ItemsSource
绑定到Main的原因。SelectedAttribute
这三个可观察集合保证具有相同数量的项?它们是按位置关联的——如中所示,类别[0]的值对应于第二个集合[0]和第三个集合[0]的值?@paul abbott对这两个问题都是肯定的我想我明白了paul谢谢,我会尝试你的解决方案。然而,我不明白为什么我不能将网格中的列直接绑定到三个独立的可观察集合,因为它们都具有相同的大小,并且通过索引关联。是否有其他更适合我需要的控件?我还应该注意,我计划为这些属性实现TwoWay
绑定
public ObservableCollection<SomeGridItem> Blahs {get; set;}
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>