web-dev-qa-db-fra.com

Liaison bidirectionnelle DataGridCheckboxColumn

J'utilise le DataGrid de la boîte à outils WPF dans .NET 3.5.

J'ai une colonne de grille de données liée à une propriété booléenne de mon objet source.

La case à cocher appelle correctement les propriétés du booléen get accessor.

Cependant, lorsque vous cochez ou décochez la case, le get au lieu de l'ensemble est appelé.

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Object,  Source={StaticResource model}, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding BoolProperty, mode=TwoWay}"/>                
        </DataGrid.Columns>
</DataGrid>

Lorsque j'utilise à la place un DataGridTemplateColumn avec une case à cocher, la propriété est correctement définie, mais il est plus compliqué de créer une mise en page agréable.

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding BoolProperty, Mode=TwoWay}"/>                            
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Que fais-je de mal en utilisant DataGridCheckBoxColumn?

20
DanBrum

Dans un DataGrid, les liaisons ne sont pas validées tant que vous n'avez pas terminé l'édition de la ligne/cellule. Si vous appuyez sur Entrée, la liaison s'appliquera de nouveau à la source.

L'utilisation d'un modèle comme celui-ci remplace ce comportement, je ne le recommanderais cependant pas. La définition explicite de TwoWay ne devrait pas non plus être nécessaire.

8
H.B.

J'ai le même problème avec toi, voici ma solution

<CheckBox HorizontalAlignment="Center" IsChecked="{Binding BoolProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
46
MoonHunter

Ma solution était de définir UpdateSourceTrigger sur PropertyChanged.

<DataGridCheckBoxColumn Header="Bool property" Binding="{Binding BoolProperty, UpdateSourceTrigger=PropertyChanged}"></DataGridCheckBoxColumn>
35
Marek Pavelek

Ma solution a été d'ajouter ElementStyle avec Style TargetType = "CheckBox":

<DataGridCheckBoxColumn Binding="{Binding BoolProperty, UpdateSourceTrigger=PropertyChanged}">
          <DataGridCheckBoxColumn.ElementStyle>
                 <Style TargetType="CheckBox"/>
          </DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>
3
Gennadij