WPF: Невозможно привязать DataGrid к списку перечислений - PullRequest
2 голосов
/ 24 марта 2011

У меня неожиданная проблема с привязкой к списку enum.Привязка молча завершается ошибкой, и я затрудняюсь объяснить, почему.

Что должен сделать этот код, это создать DataGrid с шаблоном ячейки в виде комбинированного списка, заполненного вариантами перечисления, и выбранному элементу присваивается значениеЭлемент списка.

Этот подход отлично работает в других местах для наблюдаемых коллекций объектов, у которых элемент enum является свойством .Value.Это только кажется, что не нравятся наблюдаемые коллекции элемента enum.



Для ясности приведу несколько примеров классов:

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 - расширение разметки, которое просто предоставляет описанияэлементов перечисления в виде списка.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 марта 2011

Элементы связанной коллекции копируются в DataContext ячеек.Вы можете использовать двустороннюю привязку к свойствам объекта, на который ссылается DataContext, потому что вы фактически изменяете тот же объект, на который ссылается связанная коллекция (т.е. будет работать {Binding Path = Value, Mode = TwoWay}).

Во втором примере вы пытаетесь изменить объект, на который ссылается DataContext, но в WPF нет возможности «обновить» связанную коллекцию таким образом.

По сути, вы можете изменить только состояниеобъект, на который ссылается DataContext.Вы не можете изменить объект, на который ссылается он или связанная коллекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...