我想将枚举值列表绑定到'DataGridComboBoxColumn'。我试了很多次,但都没用。
我有:
viewmodel类:
public class ViewModel
{
public ViewModel()
{
TestCollection= new ObservableCollection<MyEnum>();
AnyClasses = new ObservableCollection<AnyClass>();
//... fill AnyClasses with stuff...
TestCollection.Add(MyEnum.Value1);
TestCollection.Add(MyEnum.Value2);
TestCollection.Add(MyEnum.Value3);
TestCollection.Add(MyEnum.Value4);
TestCollection.Add(MyEnum.Value5);
}
public ObservableCollection<MyEnum> TestCollection { get; set; }
public ObservableCollection<AnyClass> AnyClasses { get; private set; }
}
我的枚举:
public enum MyEnum
{
Value1,
Value2,
Value3,
Value4,
Value5
}
后台代码: public partial class WPFWindow
{
private ViewModel Vm { get; set; }
public WPFWindow()
{
InitializeComponent();
Vm = new ViewModel();
DataContext = Vm;
}
...
}
最后是XAML:
<DataGrid AutoGenerateColumns="False" Height="289" x:Name="dataGridAnything" ItemsSource="{Binding AnyClasses}" >
<DataGrid.Columns>
<DataGridComboBoxColumn Width="200" Header="Optionen" ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}, Path=DataContext.TestCollection}" SelectedValuePath="Value"/>
</DataGrid.Columns>
</DataGrid>
如果启动项目,DataGridComboBoxColumn中不会显示任何内容。我做错了什么?谢谢你的帮助。
编辑:你可以在这里下载项目(用VS 2013构建):下载
使用本例中提到的ObjectDataProvider
。这是将枚举绑定到组合框的首选方式,因为您不必在代码中手动填充枚举集合。
在资源中声明ObjectDataProvider
:
<ObjectDataProvider x:Key="myEnum" MethodName="GetValues" ObjectType="{x:Type core:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="{x:Type l:MyEnum}"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
(你必须声明你的本地命名空间l
和core
命名空间:xmlns:core="clr-namespace:System;assembly=mscorlib"
)
然后将DataGridComboBoxColumn
绑定到它:
<DataGridComboBoxColumn Width="200" Header="Optionen" ItemsSource="{Binding Source={StaticResource myEnum}}" SelectedValuePath="Value"/>
编辑
因为你必须在运行时修改枚举集合,所以看一下这个问题
简而言之,这是DataGridComboBoxColumn
的一个已知问题。你必须改变它的元素样式:
<DataGridComboBoxColumn Width="200" Header="Optionen">
<DataGridComboBoxColumn.ElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource"
Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window},
Path=DataContext.TestCollection}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window},
Path=DataContext.TestCollection}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>