0

我正在玩ICollectionView,並遇到一個問題,我想我理解「爲什麼」,但不是「我該如何解決」。 :)更改屬性值後重建WPF數據綁定

我有一個ComboBox這是數據綁定爲ICollectionView,並且其初始設置與下面的代碼:直到我執行一段代碼,生成一個新的IEnumerable<string>和套

NameView = CollectionViewSource.GetDefaultView(names); // names is an IEnumerable<string> that comes from a LINQ query 
NameView.CurrentChanged += new EventHandler(NameView_CurrentChanged); 

一切的偉大工程再次使用與上面相同的代碼重新命名NameView。一旦我這樣做,CurrentItem不再正常工作。

我已經與ObservableCollection<string>數據綁定到組合框遇到這個問題之前,我用Clear()Add(),而不是ObservableCollection<string>屬性設置爲一個新的ObservableCollection<string>繞過「解除綁定」的問題。

我的問題包括: 1.如果我希望能夠將屬性設置爲新集合,我可以以某種方式重新建立新集合的數據綁定嗎?如果是這樣,怎麼樣?如果不是,你能解釋爲什麼這從根本上不可能的背後的WPFisms? 2.處理ObservableCollection<string>ICollectionView變化的最佳方法是什麼?我的方法只是清除和添加唯一的方法來做到這一點?

回答

1

當你將你的WPF控件綁定到ICollectionViews(當你用InitializeComponent調用解析XAML時發生 - 你應該真的在XAML中定義綁定!),控件訂閱你的集合發佈的所需事件(例如CollectionChanged )。

您的集合屬性只是對內存地址的引用。當您將其彎曲到新集合(即新地址)時,DataBinding不會注意到。你不能指望原始集合發佈諸如「IAmOuttaHere」之類的東西,顯然這些控件不會聽到一個新集合說「我是新人」。但如果我看到這個正確的,你的片斷什麼也不做,但添加的事件處理程序的CurrentChanged(意味着你被選中時在ComboBox一些其他項目觀察)

綁定是所有關於通知,所以 - 只要你不不會告訴你的收藏已被交換,他們會堅持最初的收藏。請嘗試執行INotifyPropertyChanged,如下所示:

public class ViewModel : INotifyPropertyChanged 
{ 
    private ICollectionView myCollection; 

    public ICollectionView MyCollection 
    { 
     get 
     { 
      return this.myCollection; 
     } 
     set 
     { 
      this.myCollection = value; 
      this.OnPropertyChanged("MyCollection"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public void ExchangeCollection() 
    { 
     this.MyCollection = new CollectionView(....) 
    } 

} 

任何綁定都應該設置爲MyCollection。雖然,我個人並沒有自己定義ICollectionViews,因爲它們並不是很好用,比如一個漂亮的IList,並且只要定義了綁定,它們就會自動包裝在任何集合中。

希望這有助於

塞比

+0

謝謝,我明白爲什麼,但我想你已經證明了我一些重要的東西在這裏。我未能使用INotifyPropertyChanged。哎呀!我會試一試,讓你知道它是怎麼回事。 – Dave 2010-09-24 17:48:05