Пользовательский флажок в WPF DataGrid не обновляет привязку - PullRequest
8 голосов
/ 28 мая 2010

У меня есть следующий (упрощенный) стиль:

<Style x:Key="MyStyle" TargetType="{x:Type CheckBox}">  
    <Setter Property="Background" Value="Blue" />  
</Style>

Если я использую его как ElementStyle AND 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>

Однако проблема остается.

Ответы [ 2 ]

12 голосов
/ 17 июля 2015

Извините за некро, но я думаю, что нашел здесь лучшее решение по переполнению стека, которое могло бы помочь людям, попавшим на эту страницу в поисках решения.

https://stackoverflow.com/a/7270548/3082531

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <CheckBox IsChecked="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

Я попробовал это, и оно отлично сработало для меня, проще, чем принятое решение, а также избавило от необходимости дополнительных кликов по флажкам.

11 голосов
/ 29 мая 2010

Прежде всего, ваше утверждение о том, что если вы удалите либо ElementStyle, либо EditingElementStyle, решит, что проблема неверна, то какие винты вы перебрали, это ElementStyle.

Дело в том, что для осуществления редактирования сетка данных должна переключиться на шаблон редактирования, что обычно происходит при щелчке мыши, однако, поскольку CheckBox обрабатывает событие щелчка мыши, сетка данных никогда не получает и никогда не переходит в режим редактирования, что не позволяет вашим изменениям когда-либо достигать ваших объектов данных (оно остается в представлении данных, но не передается исходным данным).

Теперь вы можете спросить, почему поведение по умолчанию в порядке? Хорошо, если вы посмотрите на значение по умолчанию свойства ElementStyle, вы заметите, что оно устанавливает для IsHitTestVisible и Focusable значение false. Это препятствует тому, чтобы CheckBox обрабатывал щелчок мыши (или событие клавиатуры), который изменяет его состояние, и позволяет сетке данных получать их, таким образом давая ему возможность войти в режим редактирования и переключиться на EditingElementStyle, который не влияет на фокусируемость и тестируемость ударов.

Посмотрите в этой записи блога пример того, как сделать это правильно Когда флажок WPF DataGrid только для чтения не доступен только для чтения?

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