2011-09-21 20 views
0

我有一個包含兩個選項卡的選項卡控件的屏幕的WPF應用程序。每個選項卡上都有一個數據網格,每個數據網格綁定到Part對象的ObservableCollection。該零件有幾個「數量」屬性,需要在網格之間進行同步。例如,如果用戶更改了grid1上partABC的數量,則partABC或者需要以相同數量添加到grid2,或者如果grid2已經包含partABC,則必須更改其數量以反映grid1。如何保持單獨集合的屬性同步?

我的問題是,這必須在兩個方向工作。如果我在兩個網格的每個部件上都設置了PropertyChanged處理程序,那麼最終會出現無限循環,因爲它們會不斷更新對方的數量。直到現在,我在選項卡控件選擇更改事件期間處理這個事情,只是遍歷其中一個列表並逐個設置數量。直到我意識到用戶可能會將數千個零件添加到他們的列表中爲止,並且此時此過程花費了無法接受的時間量完成(對於4500個零件對象,大約需要25秒),這種方法運行得很好。

編輯
第一網格包含在數據庫中的每一個部分,作爲不大不小的「接單」,用戶只需滾動到他們正在尋找的一部分,並輸入數量。第二個網格僅包含由用戶手動輸入的部分,以便他們喜歡輸入他們想要的部分的數量。 Grid2始終是grid1的子集。

+1

如果您將新值與現有值進行比較並且不會產生無限循環財產如果相同就會改變事件。例如,'set {if(value!= _myproperty){_ myproperty = value; RaisePropertyChanged(()=> MyProperty);}}' – Dmitry

回答

1

您可以通過數據綁定來完成此操作。您不應該創建重複的零件對象。取而代之的是複製保存部件的集合。

Part sharedPart = new Part(); 
Part onlyInTabA = new Part(); 
Part onlyInTabB = new Part(); 

ObservableCollection<Part> tabAParts = new ObservableCollection<Part>() { sharedPart, onlyinTabA }; 
ObservableCollection<Part> tabBParts = new ObservableCollection<Part>() { sharedPar, onlyInTabB }; 

現在使用tabAParts數據綁定到標籤A和tabBParts電網數據綁定到網格上的標籤乙

如果您Part類實現INotifyPropertyChanged然後改變sharedPart屬性將更新兩個兩個柵格標籤。當您添加新零件時,您可以選擇將其共享(將其添加到兩個集合中)或將其保留爲特定於標籤的零件

+0

對不起,我剛剛意識到我的問題是缺少一些信息。爲clairty編輯的初始職位。 – drowned

+0

其實我想這個想法仍然有效,我只需要添加tabA集合中的現有部分,只要我需要插入到tabB集合中。非常好,非常感謝。 – drowned