綁定的Mode和UpdateSourceTrigger屬性取決於您綁定到的依賴項屬性。根據MSDN:
默認值是Default,它將返回目標依賴項屬性的默認UpdateSourceTrigger值。但是,大多數依賴屬性的默認值是PropertyChanged,而Text屬性的默認值是LostFocus。
確定依賴項屬性的默認UpdateSourceTrigger值的編程方法是使用GetMetadata獲取屬性的屬性元數據,然後檢查DefaultUpdateSourceTrigger屬性的值。
所以你的情況,你都結合器isChecked是在ToogleButton類定義如下:
public static readonly DependencyProperty IsCheckedProperty =
DependencyProperty.Register("IsChecked", typeof (bool?), typeof (ToggleButton),
(PropertyMetadata) new FrameworkPropertyMetadata(
BooleanBoxes.FalseBox,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal,
new PropertyChangedCallback(ToggleButton.OnIsCheckedChanged)));
所以BindsTwoWayByDefault使得Mode=TwoWay
冗餘,同時 quering元數據:
var def = ((FrameworkPropertyMetadata)CheckBox.IsCheckedProperty.GetMetadata(typeof(CheckBox))).DefaultUpdateSourceTrigger;
結果在PropertyChanged
,這使得UpdateSourceTrigger=PropertyChanged
部分還reduntant。
編輯: 關於這一部分:
當我忽略的模型的結合是從來沒有所謂的那一部分當的ObservableCollection變化的值。
很好,我不能解釋你自己已經注意到的行爲(但它很容易重現)。我期待根據依賴項屬性默認UpdateSourceTrigger綁定更新viewmodel。但是我注意到ViewModel甚至在焦點丟失時都沒有更新,但是當你將焦點移到下一行或者按下回車鍵。所以Colin Eberhardt在他的blog中給出的解釋似乎是我能找到的最好的解釋。很明顯,這種行爲與DataGrid強烈相關,如果您在網格外部具有相同的複選框,那麼ViewModel將按預期進行更新,而不會將明確的UpdateSourceTrigger設置爲PropertyChanged。
當您綁定到DataTable時,您實際上綁定到DataTable的DataView類型的DefaultView。因此,表的每一行都將綁定到DataRowView。如果您查看DataRowView的文檔,您會發現它實現了IEditableObject接口,這是此處的重要因素。這個接口允許你對你的對象執行trasnactional改變,也就是說你可以在'transaction'中改變對象的屬性,然後在一個原子操作中提交。默認情況下,當你綁定到一個DataGrid時,這發生在用戶完成編輯一行時,通過移動焦點或按Enter鍵。
「Mode = TwoWay」和「UpdateSourceTrigger = PropertyChanged」都是必需的,因爲它們都是默認值。 – Clemens