2011-03-23 163 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引用的對象的狀態。您無法更改由其引用的對象或綁定的集合。