【问题标题】:WPF: Cannot bind DataGrid to enum listWPF:无法将 DataGrid 绑定到枚举列表
【发布时间】:2011-03-23 22:28:19
【问题描述】:

我在绑定到枚举列表时遇到了意外问题。绑定静默失败,我不知道为什么。

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

这种方法在其他地方也可以很好地工作,对于具有枚举元素作为其 .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 是一个标记扩展,它简单地将枚举元素的描述作为一个列表提供。

提前致谢。

【问题讨论】:

  • 可能你没有在convertEnumValueToIndex转换器中指定convertback方法。并且 SelectedITem 属性优于 SelectedIndex 属性。
  • 感谢您的回复。转换器似乎不是问题——两个方向都实现了,但对于这个特定的组合框根本没有调用。正如我所说,这种确切的结构在其他地方也适用,我使用完全相同的转换器类实例。
  • 无论如何,问题出在 SelectedIndex 及其绑定中。它绑定到对数据网格的所有列都是单一的完整对象。第一个 xaml 有什么问题?

标签: wpf templates data-binding datagrid enums


【解决方案1】:

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

在您的第二个示例中,您试图更改 DataContext 引用的对象,但 WPF 中没有类似“更新”绑定集合的工具。

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

【讨论】:

    猜你喜欢
    • 2019-11-30
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2012-05-05
    • 2016-03-26
    • 2010-12-16
    相关资源
    最近更新 更多