DataGridComboBoxColumn不显示SelectedItem

时间:2014-01-17 18:56:22

标签: c# wpf mvvm

我有一个ViewModel(其结构的伪代码):

class ViewModel
{
    public List<Package> Packages { get; set; }
}
enum Type
{
    Type1,
    Type2, ....
}
class Package
{
    public Type PackageType { get; set; }
}

这就是我将DataGrid与ViewModel的属性包绑定的方式。

<DataGrid ItemsSource="{Binding Packages}">
        <DataGrid.Columns>
            <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource Types}}"
                                    SelectedItemBinding="{Binding PackageType, Mode=TwoWay}">
            </DataGridComboBoxColumn>
        </DataGrid.Columns>

这就是我定义资源类型的方法:

<Window.Resources>
    <CollectionViewSource x:Key="Types">
        <CollectionViewSource.Source>
            <ObjectDataProvider MethodName="GetNames" ObjectType="{x:Type sys:Enum}">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="s:Type"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
        </CollectionViewSource.Source>
    </CollectionViewSource>
</Window.Resources>

DataGridComboBoxColumn可以显示ComboBox。但是,它不显示Package.PackageType的值。它的行为就像绑定只是一种来源。当我更新ComboBox时,对象会更新。另一种方式不起作用。

请帮忙。非常感谢。

2 个答案:

答案 0 :(得分:1)

感谢所有答案。我做了一些更多的研究。事实证明,问题出在我定义ObjectDataProvider时。我需要使用MethodName="GetValues"代替。

答案 1 :(得分:0)

包需要实现INotifyPropertyChanged。如果您的包列表可能会更改,请改用ObservableCollection。使视图模型实现INotifyPropertyChanged不会有什么坏处。

public class Package : INotifyPropertyChanged
{
    private Type packageType;

    public Type PackageType 
    {
        get
        {
            return this.packageType;
        } 

        set
        {
            if (this.packageType != value)
            {
                this.packageType = value;
                this.NotifyPropertyChanged("PackageType")
            }
        }
    }

    // Implementation of INotifyPropertyChanged
    ...
}