我有一个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时,对象会更新。另一种方式不起作用。
请帮忙。非常感谢。
答案 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
...
}