У меня есть следующий (упрощенный) стиль:
<Style x:Key="MyStyle" TargetType="{x:Type CheckBox}">
<Setter Property="Background" Value="Blue" />
</Style>
Если я использую его в качестве ElementStyle И EditingElementStyle в моем DataGridCheckBoxColumn:
<DataGridCheckBoxColumn Binding="{Binding IsEnabled}"
ElementStyle="{StaticResource MyStyle}"
EditingElementStyle="{StaticResource MyStyle}" />
Затем моя привязка, IsEnabled
, не переключается, когда я проверил/снял флажок флажок строки. Если я удаляю или ElementStyle, EditingElementStyle или обоих, то обязательные обновления без проблем. Почему это?!
Кроме того, я пытался работать вокруг проблемы с помощью следующего кода:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsEnabled}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Однако проблема остается.
Прежде всего, ваше утверждение, что если вы удалите ElementStyle
или EditingElementStyle
решает проблему, неверно, что вас беспокоит, так это ElementStyle
.
Дело в том, что для выполнения редактирования сетка данных должна переключиться на шаблон редактирования, что обычно происходит по щелчку мыши, однако, поскольку CheckBox
обрабатывает событие щелчка мыши, сетка данных никогда не получает их и никогда не переходит в режим редактирования, предотвращая попадание ваших изменений в объекты данных (они остаются в представлении данных, но не передаются в исходные данные).
Теперь вы можете спросить, почему поведение по умолчанию в порядке? Что ж, если вы посмотрите на значение по умолчанию для свойства ElementStyle
, вы заметите, что оно устанавливает для IsHitTestVisible
и Focusable
значение false. Это предотвращает CheckBox
от обработки щелчка мыши (или события клавиатуры), который изменяет его состояние, и позволяет сетке данных получать их, тем самым давая возможность перейти в режим редактирования и переключиться на EditingElementStyle
, который не влияет на фокусируемость и тестируемость попаданий.
Пример того, как это сделать, можно найти в этой записи блога Когда CheckBox только для чтения WPF DataGrid не доступен только для чтения?