DataGridComboBoxColumn binding to List<Enum>



我想将枚举值列表绑定到'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>

(你必须声明你的本地命名空间lcore命名空间: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>

最新更新