我有一个与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