首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# WPF中由2个ObservableCollection组成的ObservableCollection的数据绑定

C# WPF中由2个ObservableCollection组成的ObservableCollection的数据绑定
EN

Stack Overflow用户
提问于 2013-01-11 22:32:35
回答 2查看 170关注 0票数 0

我遇到了一些问题,当我试图绑定一个由另外两个人组成的ObservableCollection。首先我需要绑定ActiveSketchs,其次我需要绑定Sketch(这是ActivesSketchs.Union(InactiveSketchs) )。

我以为下面的代码可以正常工作,但是ActiveSketch绑定运行正常,但Sketchs绑定运行不正常:

代码语言:javascript
复制
    private ObservableCollection<Sketch> _sketchs;
    public ObservableCollection<Sketch> Sketchs
    {
        get { return _sketchs = new ObservableCollection<Sketch>(ActiveSketchs.Union(InactiveSketchs)); }
        set { _sketchs = value; }
    }

    private ObservableCollection<Sketch> _activeSketchs;
    public ObservableCollection<Sketch> ActiveSketchs
    {
        get { return _activeSketchs; }
        set { _activeSketchs = value; }
    }

    private ObservableCollection<Sketch> _inactiveSketchs;
    public ObservableCollection<Sketch> InactiveSketchs
    {
        get { return _inactiveSketchs; }
        set { _inactiveSketchs = value; }
    }

下面是我如何设置源项:

代码语言:javascript
复制
    HeadbandRight.ItemsSource = Sketchs;
    HeadbandLeft.ItemsSource = Sketchs;
    MainScatterViewer.ItemsSource = ActiveSketchs;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 00:07:13

您应该使用CollectionViewSource从列表中获取已筛选的项目:

代码语言:javascript
复制
public InitFunction()
{
    this.Sketchs = new ObservableCollection<Sketch>();

    this.ActiveSketchs = new CollectionViewSource();
    this.ActiveSketchs.Source = this.Sketches ;
    this.ActiveSketchs.Filter += (s, e) =>
    {
        var sketch = e.Item as Sketch;

        e.Accepted = sketch.IsActive; // or whatever test you need
    };

    HeadbandRight.ItemsSource = Sketchs;
    HeadbandLeft.ItemsSource = Sketchs;
    MainScatterViewer.ItemsSource = ActiveSketchs.View;
}

public ObservableCollection<Sketch> Sketchs { get; set; }

public CollectionViewSource ActiveSketchs { get; set; }

完整示例如下:http://uicraftsman.com/blog/2010/10/27/filtering-data-using-collectionviewsource/

票数 0
EN

Stack Overflow用户

发布于 2013-01-11 22:43:23

这对我来说是没有意义的

代码语言:javascript
复制
private ObservableCollection<Sketch> _sketchs;
public ObservableCollection<Sketch> Sketchs
{
    get { return _sketchs = new ObservableCollection<Sketch>(ActiveSketchs.Union(InactiveSketchs)); }
    set { _sketchs = value; }
}

如果get是一个联合,为什么还要有一个set呢?

如果它只有一个get,为什么它需要是一个ObservableCollection呢?

对单个OCs的更改无论如何都不会触发在组合上更改的集合。

你可以通过newing返回一个组合的OC,但是对oc1或oc2的更改仍然不会触发一个集合,这个集合改变了OCcomb,让UI知道要更新。

由于您需要在组合对象上手动触发一个NotifyPropertyChanged,因此您最好返回一个IEnumerable。

代码语言:javascript
复制
    private ObservableCollection<string> oc1 = new ObservableCollection<string>();
    private ObservableCollection<string> oc2 = new ObservableCollection<string>();
    public MainWindow()
    {
        oc1.Add("one");
        oc1.Add("two");
        oc2.Add("three");
        oc2.Add("four");
        this.DataContext = this;
        InitializeComponent();
    }
    public IEnumerable<string> IEcomb { get { return oc1.Union(oc2); } }
    public ObservableCollection<string> OCcomb { get { return new ObservableCollection<string>(oc1.Union(oc2)); } }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14280285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档