Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF MVVMLight:基于另一个DataGrid的SelectedItem更新DataGrid_C#_.net_Wpf_Mvvm Light_Wpfdatagrid - Fatal编程技术网

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
应用程序

我的
模型
由一个
属性
类和一个名为
属性
可观察集合
属性的
数据集
类组成

My
MainViewModel
具有一个
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>