【问题标题】:WPF ObservableCollection and Listbox.itemsource exceptionWPF ObservableCollection 和 List Box.itemssource 异常
【发布时间】:2013-08-16 22:26:33
【问题描述】:

编辑整个帖子以澄清...我似乎无法确定这一点:

BackgroundWorker 从作为对象列表的 WCF 服务接收数据。服务引用配置为 ObservableCollection。

我通过委托将 ObservableCollection 传递到我的主 UI 线程,并将其设置为等于 UI 线程 Local Collection。

列表框绑定到此本地集合并且不会更新。我已将以下内容添加到我的收藏中:

public ObservableCollection<EmployeeData> _empData { get; set; }

public event PropertyChangedEventHandler PropertyChanged;

public ObservableCollection<EmployeeData> EmpData
    {
        get { return _empData ; }
        set
        {
            _empData = value;
            OnPropertyChanged("EmpData");
        }
    }

private void OnPropertyChanged(string p)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(p));
    }

这甚至会触发,但 PropertyChanged 始终为空。我的 XAML 列表框有一个绑定声明为:

ItemsSource="{Binding Path=EmpData}"

无论我做什么 EmpData 更新但 ListBox 没有,我尝试了其他几种方法,但列表框中没有任何变化,它始终只是 null。

我已经为此工作了一天多,我似乎无法让整个自动更新的东西“点击”。

【问题讨论】:

    标签: wpf binding listbox observablecollection itemsource


    【解决方案1】:

    我不确定我是否完全理解您在做什么,但这里有一些建议。

    • 有一个 ObservableCollection
    • 将您的 itemcollection(或列表框或其他)绑定到此
    • 根据用户,清除并使用列表数据填充该 observablecollection
    • 如果有任何变化,让后台工作人员更新列表并刷新可观察集合。

    理想情况下,您的 EmployeeData 类将实现 INotifyPropertyChanged 接口,以便属性更改将在您的视图中自动更新。

    【讨论】:

    • 我做了一些更改,添加了一个简单的 ICollectionView 并将其设置为雇员列表上的 GetDefaultView。我在运行时添加了项目作为本地测试,它们确实显示在列表中,但是,传入的数据不会触发 INotifyPropertyChange。它是远程设置的(该类实现了该接口)并且服务配置确实允许数据绑定,所以我不确定为什么它不会自行更新。
    • 代码看起来不错。可能是绑定问题。尝试在构造函数中将类的数据上下文设置为自身
    • 我试了一下没有用,除非我先运行 clear() 然后重新填充,否则它不会这样做。所以我最终在对象上再次设置了 itemssource,因为我没有足够的想法和耐心。我有一种感觉,因为我将要替换的整个集合指定为 _empData = _newData;并且它没有相应地采取行动,但是替换每个对象会很慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多