【发布时间】:2014-04-07 08:45:42
【问题描述】:
网上有很多相关的问题,都是针对同一个问题的;但是,没有一个答案对我有帮助。
简而言之基本场景:
我有一个包含 ComboBox 和 Reset-Button 的对话框。 ComboBox 绑定到 ViewModel。单击按钮时,我想更新 ComboBox 中的项目。这不起作用。
<ComboBox x:Name="EditorFonts" SelectedValue="{Binding FontValue, Mode=TwoWay}" />
显而易见的答案或反问题是:我是否使用了 OnNotifyPropertyChanged?嗯,是的,基本上我是这样做的,正在调用下面的方法……
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
但是,PropertyChanged 为 NULL;因此,if 块没有被提升,也没有任何反应。
我也在网上发现SelectedValue可能有问题,我应该尝试改用SelectedItem。这也无济于事。
即使我直接更新 ComboBox 值(并且不使用 Source-to-Target-Binding),视图也不会更新。
在这一点上,我需要添加一些关于实现的更多细节,很遗憾,我无法以代码的形式提供这些细节。一方面,这是一种复杂的方式,另一方面,我并不是所有的代码部分。这里有一个简短的解释:
对话框本身是由另一个团队提供的。他们拥有重置按钮。他们提供了一个接口。实现此接口并使用 MEF 导出时,我的子页面将显示在对话框中,并在单击重置按钮时收到通知。这一切都是在另一个程序集中实现的,我对它们的实现了解不多。
因此,当我收到有关重置按钮的通知时,我会尝试如上所述刷新该值。由于这不起作用,我在我的 ComboBox 旁边放了一个自己的 Reset-Button(我们称之为 Reset2)。触发 Reset2 时,我提出了完全相同的代码,现在 ComboBox 正在更新。此外,PropertyChanged 不是 NULL。
我的结论是,我的 DataBinding 的实现不可能是错误的。实际上,当关闭对话框并再次打开它时(使用 Reset1 后),ComboBox 代表正确的值。
此外,我绑定到哪个属性并不重要。
我尝试了以下任何一种机制来刷新 ComboBox,但都没有成功。
BindingExpression be = Value.GetBindingExpression(ComboBox.SelectedValueProperty);
be.UpdateTarget();
EditorFonts.Dispatcher.Invoke(emptyDelegate, DispatcherPriority.Render);
EditorFonts.InvalidateVisual();
EditorFonts.InvalidateProperty(ComboBox.SelectedValueProperty);
EditorFonts.InvalidateMeasure();
EditorFonts.InvalidateArrange();
EditorFonts.UpdateLayout();
我很确定,一旦我发现 PropertyChanged 值为 NULL 的原因,ComboBox 就会正确更新。但是,我完全不知道如何解决这个问题。
那么,有没有人猜测可能出了什么问题?我还能寻找什么,因为有关 DataBinding 的琐碎问题(例如不调用 OnPropertyChanged)不是原因。
我尝试了一个肮脏的“hack”,即每当单击 Reset1 时,我都会在 Reset2.Clicked 上引发一个事件:
Reset2.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
那么 PropertyChanged 确实不等于 NULL,但是——够有趣的——ComboBox 仍然没有更新。
我不是出于什么目的尝试这样做,但我确信它会成功,所以我现在更加困惑为什么 ComboBox 拒绝显示我想看到的内容。
【问题讨论】:
-
你打电话给 OnPropertyChanged("SelectedValue");在您的 Selected Value 属性中??
-
@Alvaro 好吧,首先我只是更改了虚拟名称,因为这不是很有代表性(与我绑定的属性名称相同);但是,是的,我这样做了。如果我不这样做,Reset2 也不会工作,因为——正如所说——我使用的是完全相同的代码(只是到达那里的方式不同)。
标签: c# wpf data-binding combobox