网上有很多相关的问题,解决了显然相同的问题;然而,没有任何答案对我有帮助。视图没有被更新。组合框不代表实际值
简单的基本情景:
我有一个对话框包含一个组合框和一个复位按钮。 ComboBox有一个绑定到ViewModel。当按钮被点击时,我想更新组合框中的项目。这不起作用。
<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值(并且不使用源到目标绑定),视图也不会更新。
在这一点上,我需要添加一些关于我作为代码不能提供的实现的更多细节。对于一个是复杂的方式,另一个我不是所有的代码部分。这里有一个简单的解释:
对话框本身由另一个团队提供。他们拥有重置按钮。他们提供了一个界面。在实现此接口并使用MEF导出时,我的子页面将显示在对话框中,并在单击重置按钮时收到通知。这一切都是在另一个程序集中实现的,我对它们的实现并不了解。
因此,当我收到关于重置按钮的通知时,我尝试按上述方法刷新值。由于这不起作用,我在我的ComboBox旁边放置了一个自己的Reset-Button(我们称之为Reset2)。当Reset2被触发时,我提出了非常相同的代码,现在ComboBox正在更新。另外,PropertyChanged是而不是 NULL。
我的结论是,我的DataBinding的实现不能错。实际上,当关闭对话框并再次打开它时(在使用Reset1之后),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,组合框将被正确更新。但是,我完全不知道如何解决这个问题。
那么,有没有人有任何猜测什么可能会出错?还有什么我可以寻找,因为有关DataBinding的微不足道的问题(如不打电话OnPropertyChanged)不是原因。
我试过一个肮脏的“黑客”,每当Reset1被点击时,我在Reset2上引发一个事件。点击:
Reset2.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
随后的PropertyChanged确实不等于NULL,但搞笑不够,组合框仍然没有更新。
我不是为了什么目的,我尝试过,但我确信它会成功,所以我现在更混淆为什么ComboBox拒绝显示我想看到的东西。
你打电话给OnPropertyChanged(“SelectedValue”);在你选择的值属性? – NTinkicht
@Alvaro嗯,首先我改变了虚拟名称,因为这不是很有代表性(与我绑定的属性名称相同);然而,是的,我这样做。如果我不这样做,Reset2也无法工作,因为 - 正如所说的 - 我使用的是相同的代码(只是如何到达那里的方式不同)。 – Em1