我试图绑定一个由另外两个人创建的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;
答案 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/