代码之家  ›  专栏  ›  技术社区  ›  Dave

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

  •  0
  • Dave  · 技术社区  · 14 年前

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

    我有一个数据绑定到ICollectionView的组合框,它最初由以下代码设置:

    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> 数据绑定到组合框,我通过使用 Clear() Add() 而不是设置 ObservableCollection<字符串> ObservableCollection<字符串>

    我的问题包括: 2处理一个项目中的变化最好的方法是什么 ObservableCollection<字符串> ICollectionView ? 我的清除和添加方法是唯一的方法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Sebastian Edelmeier    14 年前

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

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

    希望这有帮助

    塞比