视图未更新。 ComboBox不代表实际值

时间:2014-04-07 08:45:42

标签: c# wpf data-binding combobox

网上有许多相关问题,解决了明显相同的问题;但是,没有一个答案对我有帮助。

基本情景简述:
我有一个包含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-block不会被提升,也没有任何反应。

我还在网上发现SelectedValue可能存在问题,我应该尝试使用SelectedItem。这对任何事都没有帮助。

即使我直接更新ComboBox值(并且不使用Source-to-Target-Binding),视图也不会更新。

此时我需要添加一些关于实现的更多细节,遗憾的是,我不能将其作为代码提供。对于一个复杂的方式和另一个方法,我不是所有的代码部分。这里有一个简短的解释:

对话框本身由另一个团队提供。他们拥有重置按钮。它们提供了一个界面。实现此界面并使用MEF导出时,我的子页面将显示在对话框中,单击Reset-Button时会收到通知。这一切都在另一个程序集中实现,我对它们的实现知之甚少 因此,当我收到有关Reset-Button的通知时,我尝试刷新上述值。由于这不起作用,我在我的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)不是原因。


我试过一个肮脏的&#34; hack&#34;这是每当点击Reset1时,我在Reset2.Clicked:

上引发一个事件
Reset2.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));

然后PropertyChanged确实不等于NULL,但足够有趣 - ComboBox仍未更新。
我不是因为我尝试过这个目的,但我确信它会成功,所以我现在更加困惑为什么ComboBox拒绝展示我想看到的东西。< / p>

1 个答案:

答案 0 :(得分:0)

使用INotifyPropertyChanged界面时,通常会看到如下代码:

var handler = PropertyChanged;
if (handler != null)
{
    handler(this, new PropertyChangedEventArgs(propertyName));
}

这用简单的英语意味着:

  

如果PropertyChanged事件附加了任何事件处理程序,请使用此PropertyChangedEventArgs对象调用它们

因此,如果handlernull,则该事件未附加任何处理程序。