【发布时间】:2016-08-04 22:25:36
【问题描述】:
我在 WPF 应用程序中遇到了 ComboBox 问题。它与其他一些问题类似,但该问题的经典解决方案似乎不起作用。
本质上和这个问题是一样的:
WPF ComboBox SelectedItem Set to Null on TabControl Switch
但是,我的 ItemsSource 已经在 SelectedItem 之后的 XAML 中,这通常会解决这个问题。
正在发生的事情是,我有一个带有组合框的视图,其中已经加载了数据,然后触发了一个事件来更新馈送到 ComboBox 的数据。 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}"/>
总而言之,我的 ComboBox SelectedItem 在 ItemsSource 更新并确保 ItemsSource 在 SelectedItem 不执行任何操作之后被设置为 null。我真的不知道为什么它被设置为空,我不知道在哪里看。为了找到解决方案,我可以查看的任何指针或内容将不胜感激。
编辑:好的,我一直在玩它,我怀疑它与来自 BackgroundWorker 的更新有关。我在我的数据服务中使用 Timer 和 BackgroundWorker 来定期更新数据库中的客户列表,以确保数据是相对最新的。 BackgroundWorker 完成后会触发一个事件,以通知感兴趣的对象列表已更新。这似乎意味着当事件被消耗时,它们位于不同的线程中。当它以这种方式更新时,在我将 SelectedItem 设置为正确的项目后将其设置为 null,因此将 Invoice.Customer 设置为 null。我很快在我的视图中添加了一个按钮来更新客户而不使用 BackgroundWorker,这似乎每次都有效。我想定期更新数据,但我需要先弄清楚这一点。
【问题讨论】:
-
我更新了我的 ItemsSource 并且我的 SelectedItem 保持在它应该在的位置。无法重现您的问题。显示 Invoice.Customer 属性的定义。