2013-12-23 29 views
0

我還是很新的WPF/XAML所以我在這裏忍受...複選框未更新時來源已變更

我有一個包含三列一個DataGrid:2個DataGridTextColumns和DataGridTemplateColumn,其中包含一個CheckBox 。 DataGrid綁定到顯示Field類型對象的集合。 CheckBox的IsChecked屬性也綁定到ViewModel中的屬性。

我希望能夠實現的是,當一個字段即DataGrid中的一行被點擊時,該字段的對應複選框將被選中或取消選中。

我已綁定到DataGrid的SelectedItem並可以檢索單擊的字段。然後我相應地設置字段的「IsChecked」屬性。

但是,複選框中的檢查似乎沒有出現(或消失),直到DataGrid中的行被重新繪製。也就是說,如果向下滾動以使該行消失,然後再向後滾動,Check將顯示在CheckBox中。當設置了IsChecked屬性值時,我引發了一個INotifyPropertyChanged事件。

任何人都可以建議這裏可能會出錯嗎?

包含CheckBox的列的代碼如下所示。

任何想法/建議/幫助將不勝感激。

非常感謝。

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="5" /> 
     </DataTemplate> 
    </DataGridTemplateColumn> 
</DataGridTemplateColumn> 
+1

是'IsChecked'實際上是一個依賴項屬性或屬性那觸發PropertyChanged事件?這看起來很好,所以我會仔細檢查綁定本身。 – TyCobb

+0

IsChecked只是一個標準屬性,即不是依賴屬性。它應該是? – user3124134

+1

它不一定是,但你需要確保你在setter中發射了PropertyChanged事件。如果你不知道,沒有什麼可以告訴Binding價值的變化。以下是DependencyProperty的一個頁面http://www.codeproject.com/Articles/18270/A-Guided-Tour-of-WPF-Part-3-Data-binding,並且爲了綁定到業務對象屬性,請查看INotifyPropertyChanged '接口和WPF。 – TyCobb

回答

1

試試這個:

首先定義新DataGridRow風格認購PreviewMouseButtonDownEvent:

<Style TargetType="{x:Type DataGridRow}"> 
    <EventSetter Event="PreviewMouseLeftButtonDown" 
       HandledEventsToo="True" 
       Handler="PreviewDataGridRowClick" 
       ></EventSetter> 
</Style> 

和事件處理程序:

private void PreviewDataGridRowClick(object sender, MouseButtonEventArgs e) 
{ 
    var datagridRow = (DataGridRow) sender; 
    var underlyingVm = datagridRow.Item as YourVM; 
    underlyingVm.IsChecked = !underlyingVm.IsChecked; 

    e.Handled = true; 
} 
+0

如果我能幫到你,我寧願不向代碼中添加代碼。據我瞭解,這只是另一種做法,我試圖通過綁定來實現,不是嗎?我想找到解決我目前的問題,找不到替代品!不管怎麼說,還是要謝謝你。 – user3124134