我有一个List类型的组合框。我有通过datacontext绑定的ItemsSource和ItemSelected。如果所选项目已更改,则会显示一条确认用户操作的弹出消息。单击“确定”后,选择将更改。但是在点击取消时,应该取消选择并保留先前的项目。下面是绑定到组合框的SelectedItem的属性。
Public SomeClass Sel
{
get
{
return _sel;
}
set
{
if (_sel != value)
{
var sview = _sel;
if (Compare())
{
_sel = value;
if (Sel != null)
IsDefault = Sel.IsDefault;
OnPropertyChanged(() => Sel);
}
else
{
MessageBoxResult result = MessageBox.Show("Message.", "Owb Message", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
_sel = value;
if (Sel != null)
IsDefault = Sel.IsDefault;
OnPropertyChanged(() => Sel);
}
else
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
_sel = sview;
OnPropertyChanged("Sel");
}), DispatcherPriority.Send, null);
return;
}
}
}
}
}
组合框位于弹出窗口中。那么Dispatcher对象在那种情况下会起作用吗?
答案 0 :(得分:1)
我猜测保留了选定的值 ,但View无法正确更新。
看一下这篇文章:http://www.codeproject.com/Articles/407550/The-Perils-of-Canceling-WPF-ComboBox-Selection。基本上,.Net 3.5中确实存在的一些解决方法不再适用于.Net 4.0 ..
答案 1 :(得分:0)
作为一般规则,如果您的视图控件泄漏到视图模型中,那么您将走上一条不想失去的路径。
创建一个拦截ComboBox的OnChanged事件并启动消息框的行为。这是关于using behaviours
的教程这样可以保留UI中的所有UI逻辑,并使您的viewmodel保持管理数据和验证。
答案 2 :(得分:0)
现在就像魔术一样!我在调用调度程序之前错过了设置值。 _sel = sview