2014-03-05 32 views
0

我創建了一個使用實體框架和WPF作爲UI的.NET項目。該UI包含兩列,一個普通只讀DataGridTextColumn和一個DataGridTemplateColumnCheckbox內啓用單單擊編輯一個DataGrid:綁定WPF控件更改後立即更新.NET EF數據庫

<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn > 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox IsChecked="{Binding IsSelectedForDisplay}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Binding="{Binding FullName}" IsReadOnly="True"/> 
    </DataGrid.Columns> 
</DataGrid> 

我已經檢查了複選框的結合,通過改變某些項工作在數據庫中直接。現在我希望應用程序立即將更改複選框提交到底層數據庫。我怎麼能這樣做?添加一些事件處理程序到視圖邏輯感覺不對,但我不知道我有什麼替代方案。

+0

我不知道更多,但您應該使用UpdateSourceTrigger PropertyChanged爲IsChecked屬性。 – Vishal

+0

我不認爲它是可以自動更新數據庫。您必須使用'checked'事件並調用數據庫更新,或者使用實現INotifyPropertyChanged的類並通過單擊按鈕處理更新。 – voddy

回答

0

如果具有IsSelectedForDisplay屬性的類實現INotifyPropertyChanged Interface,那麼您可以將處理程序附加到集合中每個數據項的INotifyPropertyChanged.PropertyChanged事件。當一個屬性發生變化時,您會收到通知,然後您可以保存更改。你可以做這樣的事情:

item.PropertyChanged += Item_PropertyChanged; 

...

private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if ((sender as YourClass) != null) 
    { 
     SaveDataType((YourClass)sender); 
    } 
} 
+0

這種方法的問題是,我將不得不監聽數據源,並註冊到集合中所有新創建的對象 - 相當多的手動邏輯。 – vwegert

+0

*相當多的手動邏輯* ...廢話。創建一個擴展'ObservableCollection '類的類,然後您可以輕鬆地將一個處理程序附加到構造函數中的每個項目以及「添加」和「插入」方法。我自己使用這種方法。 – Sheridan

0

經過一番根據提示使用UpdateSourceTrigger挖,我發現了以下解決方案:

<CheckBox IsChecked="{Binding IsSelectedForDisplay, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, NotifyOnSourceUpdated=True}" Binding.SourceUpdated="Binding_SourceUpdated" /> 

在事件處理函數,我可以調用dbContext.SaveChanges();(儘管我可能會將其替換爲一個事件,以便從稍後的剩餘邏輯中解耦該視圖。)