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