0

我现在正在玩 ICollectionView,遇到了一个问题,我认为我理解“为什么”,但不理解“我该如何解决它”。:)

我有一个数据绑定到 ICollectionView 的 ComboBox,它最初是使用以下代码设置的:

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

一切正常,直到我执行一段代码,该代码生成一个新的IEnumerable<string>并使用与上面相同的代码再次设置 NameView。一旦我这样做,CurrentItem将不再正常工作。

ObservableCollection<string>在将数据绑定到 ComboBoxes之前,我遇到过这个问题,我通过使用Clear()Add()不是将ObservableCollection<string>属性设置为新的ObservableCollection<string>.

我的问题包括: 1. 如果我希望能够将属性设置为新集合,我可以以某种方式重新建立与新集合的数据绑定吗?如果是这样,怎么做?如果不是,你能解释一下为什么这根本不可能的背后的 WPFisms 吗?2. 处理ObservableCollection<string>or变化的最佳方法是ICollectionView什么?我只是清除和添加的方法是唯一的方法吗?

4

1 回答 1

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 那样好用,而且一旦定义了绑定,它们就会自动包装在任何集合周围。

希望这可以帮助

塞比

于 2010-09-24T07:59:51.127 回答