2013-01-11 138 views
0

尝试绑定从其他人创建的ObservableCollection时出现了一些问题。 首先,我需要绑定ActiveSketchs,其次我必须绑定Sketchs(这是ActivesSketchs.Union(InactiveSketchs)分开。从ObservableCollection在C#中创建ObservableCollection的数据绑定WPF

我想下面的代码会工作,但它并没有该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; 
+1

究竟什么是你所得到的错误?请注意,无论何时您请求,Sketchs将始终是一个新实例。这是一个坏主意。而是倾听“ActiveSketchs”和“InactiveSketchs”中的更改并相应地更新“素描”。 –

+0

我得到0错误,只是“草图”容器仍然无效。之后,我从愚蠢的角度为Sketch做了一个新实例...我将研究如何根据Active/InactiveSketchs更改更新Sketch,谢谢! –

+0

你应该从构造函数中实例化,而不是属性。 – Xcalibur37

回答

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/

0

这只是没有任何意义,我

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

为什么有一套如果得到一个工会?

如果它只是一个get为什么它需要成为一个ObservableCollection?
对个别业主立案法团的更改不会触发组合变更的集合。
您可以通过newing返回组合OC,但对oc1或oc2的更改仍然不会触发UIcomb更改的集合,以便知道要更新。
由于您需要手动触发组合的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)); } } 
+0

不工作,就像Daniel Hilgarth说的那样:“请注意,Sketch在任何时候都会是一个新的实例,这不是一个好主意,而是倾听ActiveSketch和InactiveSketch中的变化,并相应地更新Sketch。 –

+0

你尝试过或者:哪个不创建新的? – Paparazzi

+0

联合()返回一个IEnumerable,我知道将IEnumerable转换为ObservableCollection的唯一方法是创建一个新的ObservableCollection吗? –

相关问题