2011-08-25 28 views
1

我已經創建了一個UserControl,它根據綁定的ObservableCollection的內容顯示轉換後的字符串值。一切工作在應用程序加載時;我的IValueConverter被調用併產生正確的字符串結果,這在我的UserControl中正確顯示。但是,如果ObservableCollection內容更改,我的控件不會更新。另外,在我創建這個控件之前,我有相同的行爲,但是綁定了一個常規的Button控件的屬性,並且這也正常工作並按預期進行了更新。DataBinding UserControl到ObservableCollection的文本屬性不會更新

任何想法,我失去了我的UserControl相同的事情?

控件屬性看起來像;

public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(MyUserControl)); 

public string Text 
{ 
    get { return GetValue(TextProperty) as string; } 
    set { SetValue(TextProperty, value); 
} 

UserControl XAML中的相關部分(顯示轉換後的字符串值)是;

<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type Controls:MyUserControl}}, Path=Text}" /> 

而控制是在一個單獨的窗口中創建的,就像這樣;

<CoreControls:MyUserControl 
    Name="myControl" 
    Text="{Binding Path=ObservableCollectionInstance, Converter={StaticResource MyValueConverter}, Mode=OneWay}" /> 

回答

0

感謝提示傢伙。

我設法找出解決方案;我可以在ObservableCollection上處理CollectionChanged事件,然後用類似的方式顯式更新目標;

BindingExpression exp = myControl.GetBindingExpression(MyUserControl.TextProperty); 
if (null != exp) exp.UpdateTarget(); 

如前所述,最有可能的,在Text屬性綁定只聽PropertyChanged事件,不NotifyCollectionChanged事件,但這種解決方案的伎倆。

1

我會用ElementName,而不是RelativeSource在你的綁定,因爲你命名你的用戶控件。此外,您正試圖將集合綁定到<Textbox>。一個<Textbox>旨在顯示一個項目。這可能是爲什麼它不工作。 ObservableCollection火災CollectionChanged事件,而不是PropertyChanged。即使它確實響應,您仍然會遇到問題,因爲ObservableCollection不會通知其包含的項目何時發生屬性更改 - 只有在添加/刪除項目時(例如,集合本身發生更改)。如果這是你想要的行爲,你將不得不編寫一些代碼。

編輯
您的意見後,它的聲音對我來說,即使你將其設置爲單向綁定模式,它的作用就像曾經的結合模式。
我會嘗試這個幫你調試它:

添加此xmlns

xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 

,然後在你的綁定補充一點:

diagnostics:PresentationTraceSources.TraceLevel=High 

here is an article on debugging bindings

你可以做的另一件事是在你的轉換器中設置斷點。當你添加/刪除東西到你的收藏時,看看它實際上是否更新。我願意打賭,它的bc ObservableCollection不是解僱事件,並且發生初始更新是因爲它不基於更新事件。

+0

RelativeSource綁定位於UserControl內的TextBlock上;用戶控件沒有在那個點上被命名。無論如何,這並不能解決這個問題。 –

+0

我故意綁定到一個集合,以便在集合中有單個項目時收集爲空的「Item [0] .SomeValue」,並且當多於1個項目時,文本框可以顯示'NONE'並且'MULTIPLE'。我的IValueConverter處理這種轉換,並且在窗口上設置初始DataContext時正確執行,但在ObservableCollection發生更改時無法正確執行。 –

1

ObservableCollection僅當物品被添加或刪除時纔會通知。它用於觀察集合。它們更適合內容控制。閱讀關於它here。你正在談論觀察一個財產,這需要INotifyPropertyChanged。發佈更多的代碼可能會有所幫助,比如如何改變集合的價值。

+0

那麼有什麼辦法刷新基於INotifyCollectionChanged的綁定? –

+0

另外; ObservableCollection由.Clear()和.Add(...)調用修改。 –

+0

您可以檢查每次更改集合時調用的轉換器嗎? – Yogesh

相關問題