通過綁定同步兩組數據的最佳方式是什麼?現在雙向收集綁定同步/鎖
Target = Custom Setters - raises custom events whenever something changed
Source = ObservableCollection - raises events whenever collection changed
我的問題是,當我收到從一個集合(例如Source.CollectionChanged事件)的更新,我需要調用自定義TargetSetters,而忽略它源於我的更新被稱爲事件。
還有另一種方式,當Target自定義事件被觸發時,我需要更新源,但忽略CollectionChanged事件。
目前,我正在保持對我的處理程序的引用,並在更新任何集合之前刪除它。例如
private void ObservableCollection_OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
{
CustomObject.SelectionChanged -= CustomObject_SelectionChanged;
// Do change logic and update Custom Object....
CustomObject.SelectionChanged += CustomObject_SelectionChanged;
}
void CustomObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ObservableCollection.CollectionChanged -= ObservableCollection_OnCollectionChanged;
// Do change logic and update ObservableCollection...
ObservableCollection.CollectionChanged += ObservableCollection_OnCollectionChanged;
}
我看到您可以使用if語句來檢查更新是否來自源代碼,以及它們是否忽略它們。例如
private void ObservableCollection_OnCollectionChanged2(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
{
if (BindingTargetUpdating) return;
BindingSourceUpdating = true;
// Do change logic and update Custom Object....
BindingSourceUpdating = false;
}
void CustomObject_SelectionChanged2(object sender, SelectionChangedEventArgs e)
{
if (BindingSourceUpdating) return;
BindingTargetUpdating = true;
// Do change logic and update ObservableCollection...
BindingTargetUpdating = false;
}
後谷歌+ SO搜索無功而返,我想看看別人是如何做,並且有很簡單的東西,我在這裏失蹤,解決這個問題呢? (我知道這些例子不是線程安全的)
如果不是,那麼首選方法是什麼?刪除和附加處理程序,或設置布爾標誌?什麼是更高性能(是的,我知道這是不太可能造成瓶頸,但出於好奇)
我問的原因是因爲,目前我正在實施附加行爲,併爲每個行爲,我創建2套字典其中每個對象的處理程序都有引用,因爲狀態必須傳遞。
我似乎無法找到.NET Binding類的綁定機制的源代碼,看看MS如何實現它。如果任何人有一個鏈接到那些將不勝感激。
對不起,我可能會丟失一些東西,但是爲什麼您的設計要求您忽略每次發生更改時發生的一些事件?我無法弄清楚你想完成什麼。你能否說出你想解決的問題? – furkle 2014-10-28 23:51:02
因爲如果您訂閱雙方,您將收到雙方的通知。造成無限循環。例如。Customibject引發事件發生變化,我的處理程序被調用並更改綁定的集合,這反過來引發了更改的事件,所以我的集合更改了處理程序被調用,其中編輯了自定義對象。這會再次引發事件,並且你處於循環中 – 2014-10-29 00:22:36
對,我說的是設計你的程序的方式必須有意地阻止它進入無限循環,這是一個相當大的代碼味道。是否有理由不只是通過INotifyPropertyChanged處理對集合的更改,還是我誤解了你的目的? – furkle 2014-10-29 00:24:58