2014-04-07 23 views
0

网上有很多相关的问题,解决了显然相同的问题;然而,没有任何答案对我有帮助。视图没有被更新。组合框不代表实际值

简单的基本情景:
我有一个对话框包含一个组合框和一个复位按钮。 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拒绝显示我想看到的东西。

+0

你打电话给OnPropertyChanged(“SelectedValue”);在你选择的值属性? – NTinkicht

+0

@Alvaro嗯,首先我改变了虚拟名称,因为这不是很有代表性(与我绑定的属性名称相同);然而,是的,我这样做。如果我不这样做,Reset2也无法工作,因为 - 正如所说的 - 我使用的是相同的代码(只是如何到达那里的方式不同)。 – Em1

回答

0

当使用INotifyPropertyChanged接口,这是习惯看到这样的代码:

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

这意味着用简单的英语是什么:

如果有附加到任何事件处理程序PropertyChanged事件,然后用这个电话PropertyChangedEventArgs对象

因此,如果handlernull,那么没有处理程序已附加到该事件。

+0

那么,什么原因可能是,某些情况下处理程序会消失(使用Reset1时会发生什么情况),而在其他处理程序中仍然存在(使用Reset2时会发生什么情况)。 Imho,一个处理者要么附着要么不附着,但不是第一件事,然后是另一件事。 – Em1

+0

这是调试的目的。 – Sheridan

+0

感谢所有相同的... – Em1