0

我在尝试绑定由其他 2 个制成的 ObservableCollection 时遇到了一些问题。首先我需要绑定 ActiveSketchs,其次我必须单独绑定 Sketchs(即 ActivesSketchs.Union(InactiveSketchs)。

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

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

2 回答 2

0

这对我来说没有意义

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

如果 get 是一个联合,为什么还要设置一个集合?

如果它只是一个 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)); } }
于 2013-01-11T14:43:23.043 回答
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/

于 2013-01-11T16:07:12.550 回答