如何在数据绑定的WPF ListBox中取消用户选择?源属性设置正确,但列表框选择不同步。WPF:取消数据绑定列表框中的用户选择?
我有一个MVVM应用程序需要取消在WPF列表框中的用户选择,如果某些验证条件失败。验证由列表框中的选择而不是提交按钮触发。
ListBox.SelectedItem
属性绑定到ViewModel.CurrentDocument
属性。如果验证失败,视图模型属性的setter将退出而不更改属性。因此,ListBox.SelectedItem
所绑定的财产不会被更改。
如果发生这种情况,视图模型属性设置器会在退出之前引发PropertyChanged事件,我认为这会足以将ListBox重置为旧选择。但这不起作用 - 列表框仍然显示新的用户选择。我需要重写该选择并使其与源属性重新同步。
只是为了防止不清楚,这里是一个例子:ListBox有两个项目,Document1和Document2; Document1被选中。用户选择Document2,但Document1无法验证。 ViewModel.CurrentDocument
属性仍设置为Document1,但ListBox显示已选中Document2。我需要将列表框选择返回到Document1。
这里是我的列表框绑定:
<ListBox
ItemsSource="{Binding Path=SearchResults, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=CurrentDocument, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
我曾尝试使用从视图模型的回调(作为事件)的视图(其中订阅事件),迫使SelectedItem属性回旧的选择。我用事件传递旧文档,它是正确的(旧选择),但列表框选择不会改回。
那么,如何让列表框选择恢复与其SelectedItem
属性绑定的视图模型属性同步?谢谢你的帮助。
'SearchResults'集合在创建控件后的任何时候是否更改?我认为在任何时候或者SelectedItem对象来自不同的集合时,ItemsSource必然会发生更改的集合可能存在问题。 – 2010-04-09 15:26:16
这是http://stackoverflow.com/questions/2608071/wpf-cancel-a-user-selection-in-a-databound-listbox其中有更多的答案,包括链接到http://博客.alner.net/archive/2010/04/25/cancelling-selection-change-in-a-bound-wpf-combo-box.aspx – splintor 2011-07-12 16:46:51