在C#WPF中由2 ObservableCollection构成的ObservableCollection上的数据绑定

时间:2013-01-11 14:32:35

标签: .net wpf observablecollection

我试图绑定一个由另外两个人创建的ObservableCollection时遇到了一些问题。 首先我需要绑定ActiveSketchs,其次我必须绑定Sketchs(分别是ActivesSketchs.Union(InactiveSketchs)。

我认为下面的代码可行,但事实并非如此。 ActiveSketch绑定可以正常工作,但不能使用Sketchs:

    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; }
    }

以下是我设置源项目的方法:

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

2 个答案:

答案 0 :(得分:0)

这对我来说没有意义

private ObservableCollection<Sketch> _sketchs;
public ObservableCollection<Sketch> Sketchs
{
    get { return _sketchs = new ObservableCollection<Sketch>(ActiveSketchs.Union(InactiveSketchs)); }
    set { _sketchs = value; }
}

如果get是一个联合,为什么有一个集合?

如果它只是为了为什么它需要是一个ObservableCollection? 无论如何,对单个OC的改变都不会改变组合的变化 你可以通过newing返回一个合并的OC,但是对oc1或oc2的更改仍然不会触发一个集合更改OCcomb以便UI知道要更新。
由于您需要在组合上手动触发NotifyPropertyChanged,您也可以返回IEnumerable。

    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)); } }

答案 1 :(得分:0)

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

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/