網上有很多相關的問題,解決了顯然相同的問題;然而,沒有任何答案對我有幫助。視圖沒有被更新。組合框不代表實際值
簡單的基本情景:
我有一個對話框包含一個組合框和一個復位按鈕。 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