2010-07-05 59 views
0

想象一下以下內容:WPF - 刷新的集合(與「新」)沒有重新綁定控件

class Repository 
{ 
    private ObservableCollection<ModelClass> _allEntries; 
    public ObservableCollection<ModelClass> AllEntries 
    { 
     get { return _allEntries; } 
     set { _allEntries = value; } 
    } 
    public void RefreshDataFromDB() 
    { 
     _all = new ObservableCollection(GetMyData()); // whatever method there is 
    } 
} 

現在有綁定到該集合一對夫婦的控制,如:

<ListView ItemsSource="{Binding Repository.AllEntries, ElementName=Whatever}"/> 

現在的問題是,如果我調用RefreshDataFromDB綁定會丟失(至少看起來如此),因爲_all現在指向新的內存部分,並且綁定仍然使用舊的引用。在這種情況下,INotifyPropertyChanged不能幫助我(例如,將它放在RefreshDataFromDB中並沒有太大幫助)。

問題將是 - 你將如何處理一個案例,你代表一個集合,並希望更新其消費者的綁定?

+0

我認爲日ere是一些錯字錯誤,你的屬性名稱是AllEntries,而你綁定到ALL! – akjoshi 2010-07-05 07:21:06

+0

你究竟是什麼意思: 「綁定丟失(至少看起來是這樣)」 你能否提供一些更多的細節。 – akjoshi 2010-07-05 07:22:20

+0

這個問題有一個簡單的解決方案,但只是澄清: 1.是的,這是一個錯字。它應該是AllEntries。 2.綁定迷路了,他們最初綁定到變量_all =>一些內存引用。當我使用'new'關鍵字時,_all引用會更改並指向內存中的另一個地址,但綁定到_all的控件仍在查看舊內存。基本上問題是如何避免使用舊地址的控制。而已。 (.Clear()+ .AddRange())的簡單解決方案幫助我的案例。 – Jefim 2010-07-05 07:41:27

回答

1

是;你不修改集合,UI綁定到集合,然後用新集合替換它。

你可以這樣做:

_all.Clear(); 
_all.AddRange(GetMyData()); 

希望幫助!


或者,讓AllEntries(或所有..你的命名似乎改變在後幾次;))一個DependencyProperty:

public static DependencyProperty AllEntriesProperty = DependencyProperty.Register("AllEntries", typeof(ObservableCollection), typeof(MyClass)); 

你需要做的get/set物業也看到這裏的一個例子:

http://msdn.microsoft.com/en-us/library/ms752914.aspx

+0

您不一定需要「DependencyProperty」 - 屬性上的「INotifyPropertyChanged」實現就足夠了。 – 2010-07-05 07:33:41

+0

謝謝,這幫了很大的忙。我沒有想到只是在第一個地方清理同一個實例:) – Jefim 2010-07-05 07:35:24