我有一個與WPF應用程序中的ComboBox鬥爭。它類似於其他一些問題,但是這個問題的經典解決方案似乎沒有工作。WPF組合框設置爲null後ItemsSource更新
從本質上講,這是同樣的問題,因爲這:
WPF ComboBox SelectedItem Set to Null on TabControl Switch
然而,我的ItemsSource已經在以後的SelectedItem的XAML,這是正常排序了這一點。
發生了什麼事情是我有一個視圖,其上已經裝載了數據的組合框,然後觸發一個事件來更新輸入到組合框中的數據。 ViewModel使用事件(由獲取數據的BackgroundWorker觸發)並使用新數據更新其作爲ItemsSource的ObservableCollection。像這樣:
int id = (int)Invoice.Customer.DatabaseID;
Customers = new ObservableCollection<Customer>(customers);
Invoice.Customer = Customers.FirstOrDefault(x => x.DatabaseID == id);
正如您所看到的,它試圖將發票上的客戶設置回原來的狀態。這種情況確實發生,在斷點處觀察到,但是,只要完成此操作,客戶就會從未識別的源(我的代碼不會出現在調用堆棧中,它全部是框架內容)被設置爲null。
的組合框的XAML是:
<ComboBox DisplayMemberPath="AccountCode"
SelectedItem="{Binding Invoice.Customer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
ItemsSource="{Binding Customers}"/>
所以總結一下,我的組合框的SelectedItem被設置爲NULL的ItemsSource更新完畢後,並確保的ItemsSource是的SelectedItem什麼都不做了。我真的不知道爲什麼它被設置爲空,我不知道在哪裏看。任何指針或事情,我可以看看,以找到解決辦法,將不勝感激。
編輯:好的,我一直在玩它多一點,我懷疑它與來自BackgroundWorker的更新有關。我在我的數據服務中使用Timer和BackgroundWorker來定期更新數據庫中的客戶列表,以確保數據相對最新。 BackgroundWorker在完成時觸發事件以通知感興趣的對象該列表已更新。這似乎意味着,當事件消耗時,它們處於不同的線程中。當它以這種方式更新時,SelectedItem在我將其設置爲正確的項目並因此將Invoice.Customer設置爲null後被設置爲null。我很快在視圖中添加了一個按鈕,以便在不使用BackgroundWorker的情況下更新客戶,這似乎每次都有效。我想定期更新數據,但我必須先弄清楚這一點,然後才能做到這一點。
我更新了我的ItemsSource,並且我的SelectedItem保持它應該在的位置。不能重現你的問題。顯示Invoice.Customer屬性的定義。 – AnjumSKhan