【问题标题】:Re-establishing WPF databinding after changing property value更改属性值后重新建立 WPF 数据绑定
【发布时间】:2010-09-24 07:01:40
【问题描述】:

我现在正在使用 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&lt;string&gt; 并使用与上面相同的代码再次设置 NameView 之前,一切都很好。一旦我这样做了,CurrentItem 将不再正常工作。

我之前在将ObservableCollection&lt;string&gt; 数据绑定到组合框时遇到过这个问题,我通过使用Clear()Add() 而不是将ObservableCollection&lt;string&gt; 属性设置为新的@987654328 来解决“解除绑定”问题@。

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

【问题讨论】:

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


    【解决方案1】:

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

    您的集合属性只是对内存地址的引用。当您将其转换为新集合(即新地址)时,DataBinding 不会注意到。您不能指望原始集合发布类似“IAmOuttaHere”之类的内容,并且显然控件不会听新集合说“我是新人”。但是,如果我没看错,您的 sn-p 只会向 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 进行任何绑定。虽然就我个人而言,我自己并没有定义 ICollectionView,因为它们不像漂亮的 IList 那样好用,而且一旦定义了绑定,它们就会自动包装在任何集合周围。

    希望对你有帮助

    塞比

    【讨论】:

    • 谢谢,我明白原因,但我认为您在这里向我展示了一些重要的东西。我未能使用 INotifyPropertyChanged。哎呀!我会试一试,然后告诉你进展如何。
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多