2011-03-23 103 views
2

我有一个意外的问题绑定到枚举列表。绑定默默失败,我无法解释为什么。WPF:无法绑定DataGrid枚举列表

该代码应该做的是创建一个DataGrid,其中单元格模板作为组合框填充了枚举选项,并将所选项目设置为列表元素。

这种方法适用于其他地方,对于具有enum元素作为其.Value属性的可观察集合。它似乎只是不喜欢枚举元素的可观察集合。



要明确,这里有一些例子类:

public enum EquipmentEnum { EquipmentA, EquipmentB, EquipmentC } 

public class EquipmentClass { public EquipmentEnum Value { get; set; } } 

工作

<DataGrid AutoGenerateColumns="False" 
      ItemsSource="{Binding equipmentClassList}"> <!-- ObservableCollection<EquipmentClass> --> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn Header="Equipment Used" > 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding Source={local:Enumeration {x:Type EquipmentEnum}}}" 
        SelectedIndex="{Binding Path=Value Converter={StaticResource convertEnumValueToIndex}, Mode=TwoWay}" 
        DisplayMemberPath="Description" 
        IsEditable="True" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

工作:

<DataGrid AutoGenerateColumns="False" 
      ItemsSource="{Binding equipmentEnumList}"> <!-- ObservableCollection<EquipmentEnum> --> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn Header="Equipment Used" > 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox ItemsSource="{Binding Source={local:Enumeration {x:Type EquipmentEnum}}}" 
        SelectedIndex="{Binding Converter={StaticResource convertEnumValueToIndex}, Mode=TwoWay}" 
        DisplayMemberPath="Description" 
        IsEditable="True" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

只是一些注意事项:

  1. local:Enumeration是标记扩展它只是提供了枚举元素列表的描述。

在此先感谢。

+0

您可能没有在convertEnumValueToIndex转换器中指定convertback方法。 SelectedITem属性优于SelectedIndex属性。 – vorrtex 2011-03-23 22:46:42

+0

感谢您的回复。转换器似乎不是问题 - 两个方向都实现了,但是对于这个特殊的组合框没有被调用。正如我所说,这个确切的结构在其他地方有效,我使用了完全相同的转换器类实例。 – dythim 2011-03-23 23:37:41

+0

无论如何,问题出在SelectedIndex及其绑定上。它绑定到数据网格所有列的单个对象。第一个xaml有什么问题? – vorrtex 2011-03-24 09:30:38

回答

0

绑定集合的项目被复制到单元格的DataContext中。您可以对DataContext引用的对象的属性使用双向绑定,因为您正在有效地改变绑定集合所引用的同一对象(即{Binding Path = Value,Mode = TwoWay})。

在第二个示例中,您尝试更改由DataContext引用的对象,但WPF中没有设施来“更新”这样的绑定集合。

基本上,你只能改变DataContext引用的对象的状态。您无法更改由其引用的对象或绑定的集合。