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

时间:2014-07-03 22:03:23

标签: c# .net wpf mvvm-light wpfdatagrid

使用WPF开发MVVMLight应用。

我的ModelAttribute类和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]; 没有显示任何内容。我做错了什么?

1 个答案:

答案 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>