我有一个ObservableCollection<A> a_collection;该集合包含'n'个项目.每个项目A看起来像这样:
public class A : INotifyPropertyChanged
{
public ObservableCollection<B> b_subcollection;
Thread m_worker;
}
Run Code Online (Sandbox Code Playgroud)
基本上,它都连接到WPF列表视图+详细信息视图控件,它在单独的列表视图中显示所选项目的b_subcollection(双向绑定,propertychanged上的更新等).当我开始实现线程时,问题出现了.整个想法是让整个a_collection使用它的工作线程来"工作",然后更新它们各自的b_subcollections并让gui实时显示结果.
当我尝试它时,我得到一个例外,说只有Dispatcher线程可以修改ObservableCollection,并且工作停止了.
任何人都可以解释这个问题,以及如何解决它?
干杯
我创建了一个继承List的Class EventList,每次添加,插入或删除时都触发一个Event:
public class EventList<T> : List<T>
{
public event ListChangedEventDelegate ListChanged;
public delegate void ListChangedEventDelegate();
public new void Add(T item)
{
base.Add(item);
if (ListChanged != null
&& ListChanged.GetInvocationList().Any())
{
ListChanged();
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
在片刻我将它用作这样的属性:
public EventList List
{
get { return m_List; }
set
{
m_List.ListChanged -= List_ListChanged;
m_List = value;
m_List.ListChanged += List_ListChanged;
List_ListChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,我可以以某种方式处理一个新的对象是否被引用或阻止它,所以我不必在setter中做事件接线?
当然,我可以将属性更改为"私有集",但我希望能够将该类用作变量.
我有三个组成部分。组件一包含组件二和三。组件二是一个列表。组件三用于向数据库添加项目。
当我将一个项目保存到数据库时,我想更新组件二中的列表。我怎么做?
我一直忙于C#4.0泛型,现在我基本上想做这样的事情:
public abstract class GenericTree<T> : Tree
where T : Fruit
{
public Tree(IFruitCollection<T> fruits)
: base(fruits) { }
}
Run Code Online (Sandbox Code Playgroud)
基本Tree类如下所示:
public abstract class Tree
{
private IFruitCollection<Fruit> fruits;
public IFruitCollection<Fruit> GetFruits
{
get { return fruits; }
}
public Tree(IFruitCollection<Fruit> fruits)
{
this.fruits = fruits;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的第一个问题.GenericTree的构造函数无法将泛型集合强制转换为水果集合.我也有GenericTree的实现:
public class AppleTree : GenericTree<Apple>
{
public AppleTree()
: base(new FruitCollection<Apple>) { }
}
Run Code Online (Sandbox Code Playgroud)
这是我的第二个问题.当我使用myAppleTree.GetFruits.Add(...)向AppleTree实例添加水果时,我不仅限于苹果.我被允许添加各种水果.我不想要这个.
我试图通过将其添加到GenericTree来解决该问题:
new public IFruitCollection<T> GetFruits
{
get { return base.GetFruits as IFruitCollection<T>; }
}
Run Code Online (Sandbox Code Playgroud)
但这也是不可能的.它总是以null返回null.当我的第一个问题得到解决时,这可能会得到解决.
IFruitCollection接口如下所示: …
我编写了一个显示项目列表的控件(在本例中只是字符串).我给开发人员一个项目列表,他可以添加和删除项目(参见下面的代码).我希望有一种方法可以在添加新项目时收到通知.因此,作为反应,控件可以更新.
private List<string> items = new List<string>();
public List<string> Items
{ get { return items; } }
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?List<...>没有事件.我能做什么 ?
我在集合列表中有几个对象。我需要知道从集合中删除对象时是否调用 Dispose() 方法?如果没有,当对象被删除时是否有某种方法可以调用它?