更改属性值后重新建立WPF数据绑定

时间:2010-09-24 07:01:40

标签: wpf data-binding .net-3.5 observablecollection icollectionview

我现在正在玩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>数据绑定到ComboBox之前遇到过这个问题,我使用Clear()Add()来解决“解除绑定”问题,而不是设置{{1属性为新ObservableCollection<string>

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

1 个答案:

答案 0 :(得分:1)

当您将WPF控件绑定到ICollectionViews时(在使用InitializeComponent调用解析XAML时发生 - 您应该在XAML中真正定义绑定!),Controls会订阅您的集合发布的必需事件(例如CollectionChanged) 。

您的集合属性只是对内存地址的引用。当您将其弯曲到新集合(即新地址)时,DataBinding将不会注意到。您不能指望原始Collection会发布类似“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那样好用,并且只要定义了绑定,它们就会自动包装在任何集合中。

希望这有帮助

塞比