2014-04-07 49 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