2012-05-18 179 views
13

我在.NET 3.5中使用WPF工具包中的DataGrid。DataGridCheckboxColumn雙向綁定

我有一個datagrid列綁定到我的源對象的布爾屬性。

該複選框正確調用布爾的屬性get accessor。

但是,當檢查或取消選中框時,調用get而不是set。

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

當我改用DataGridTemplateColumn在裏面有一個複選框的屬性設置正確不過話,那就更復雜創建一個很好的佈局。

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

我在做什麼錯誤使用DataGridCheckBoxColumn?

回答

8

DataGrid中,在您結束對行/單元格的編輯之前,綁定不會被提交。如果按下輸入,則綁定將應用回源。

使用這樣的模板會覆蓋該行爲,但我不會推薦。明確設置TwoWay也不是必須的。

+0

好感謝在這種情況下的行爲是必要的,當用戶檢查我想在視覺上更新的東西的盒子作爲屏幕。有沒有辦法使用DatGridCheckBoxColumn來做到這一點?還有什麼是最好的方式,以便在初始點擊用戶不必點擊兩次選擇行然後複選框,你可以選擇與鼠標懸停事件的行? – DanBrum

+0

@DanBrum:我不知道你是否可以繞過這個使用該列的方法,如果你找不到方法,你可以定義你自己的DataGridCheckBoxColumn。 MouseOver上的選擇應該是可能的。 –

37

我有同樣的問題與你,這裏是我的解決方案

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

謝謝先生,在找到此解決方案之前,我不得不在網絡上搜索一段時間。很棒。 – Mash

+2

'''TwoWay'''沒有必要,因爲它是默認的。 – Den

31

我的解決辦法是UpdateSourceTrigger設置的PropertyChanged。

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

這是最好的答案。 – pennyrave

+0

這應該是答案 – JobaDiniz

3

我的解決辦法是添加ElementStyle與樣式的TargetType =「複選框」:

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