2013-01-11 112 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嗎? –

相關問題