2012-05-18 11 views
13

Sto utilizzando il DataGrid dal toolkit WPF in .NET 3.5.DataGridCheckboxColumn binding bidirezionale

Ho una colonna datagrid legata a una proprietà booleana dal mio oggetto sorgente.

La casella di controllo chiama le proprietà booleane per ottenere l'accesso corretto.

Tuttavia, quando si seleziona o deseleziona la casella, viene richiamato il risultato al posto del set.

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

Quando invece uso una DataGridTemplateColumn con una casella di controllo in esso la proprietà è impostata correttamente ma allora è più complicato per creare un layout piacevole.

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

Cosa sto facendo male utilizzando DataGridCheckBoxColumn?

risposta

8

In un DataGrid i binding non vengono impegnati fino a quando non si termina la modifica della riga/cella. Se si preme Invio, la rilegatura verrà applicata alla fonte.

L'utilizzo di un modello come questo sovrascrive tale comportamento, tuttavia non lo consiglierei. Inoltre, impostare esplicitamente TwoWay non dovrebbe essere necessario.

+0

grazie Ok in questo caso è necessario in quanto quando l'utente controlla la casella che voglio aggiornare visivamente qualcosa sul comportamento lo schermo. C'è un modo per farlo usando il DatGridCheckBoxColumn? Inoltre, qual è il modo migliore in modo che sul clic iniziale l'utente non debba fare clic due volte per selezionare la riga, quindi la casella di controllo, è possibile selezionare la riga con l'evento mouseover? – DanBrum

+0

@DanBrum: Non so se è possibile aggirare questo utilizzando quella colonna, è possibile definire il proprio DataGridCheckBoxColumn se non si trova un modo. La selezione su MouseOver dovrebbe essere possibile. –

37

ho avuto lo stesso problema con voi, ecco la mia soluzione

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

Grazie signore, ho dovuto cercare sul web per un po 'prima di trovare questa soluzione. Funziona alla grande. – Mash

+2

'' 'TwoWay''' non è necessario in quanto predefinito. – Den

31

La mia soluzione era quella di impostare UpdateSourceTrigger a PropertyChanged.

<DataGridCheckBoxColumn Header="Bool property" Binding="{Binding BoolProperty, UpdateSourceTrigger=PropertyChanged}"></DataGridCheckBoxColumn> 
+3

Questa è la migliore risposta. – pennyrave

+0

questa dovrebbe essere la risposta – JobaDiniz

3

La mia soluzione era quella di aggiungere ElementStyle con stile TargetType = "checkbox":

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