Я пытаюсь использовать перечисление в Datagrid. Позвольте мне показать вам два способа, которыми он может работать. Во-первых, я создаю ComboBox внутри DataGrid, DataContext.MyOptions возвращает список строк для всех значений enum.Свойство Bind ViewModel для DataGridComboBoxColum
<DataGridTemplateColumn Header="Enum1">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.MyOptions, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItem="{Binding Enum1, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource MyConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Далее я пытаюсь использовать DataGridComboBoxColumn, но чтобы получить эту работу, я должен добавить ElementStyle и EditingElementStyle (я скопировал откуда-то)
<DataGridComboBoxColumn Header="Enum1" Width="*"
SelectedItemBinding="{Binding Enum1, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource MyConverter}}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.MyOptions, RelativeSource={RelativeSource AncestorType=Window}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.MyOptions, RelativeSource={RelativeSource AncestorType=Window}}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
Теперь мой вопрос, почему ниже не работает. Столбец отображается пустым, но значение есть.
<DataGridComboBoxColumn Header="Enum1" Width="*"
ItemsSource="{Binding Path=DataContext.MyOptions, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItemBinding="{Binding Enum1, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource MyConverter}}">
</DataGridComboBoxColumn>
В выходном окне я вижу следующее сообщение об ошибке:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=DataContext.MyOptions; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=59316889); target property is 'ItemsSource' (type 'IEnumerable')
Спасибо за быстрый ответ. Когда я пытаюсь это сделать, я получаю следующий аргумент: Ошибка System.Windows.Data: 3: Не удается найти элемент, предоставляющий DataContext. BindingExpression: (нет пути); DataItem = NULL; целевой элемент - «FrameworkElement» (Name = ''); target is 'DataContext' (type 'Object') – uncletall
my bad..нельзя сказать, что класс должен расширять класс Freezable .. обновленный ответ ... Freezable используются для привязки данных, где DataContext не унаследован – Nitin
Спасибо ! Протестировал его сейчас, и он работает! Еще многое узнать;) – uncletall