相关疑难解决方法(0)

如何通过工作线程更新ObservableCollection?

我有一个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,并且工作停止了.

任何人都可以解释这个问题,以及如何解决它?

干杯

c# wpf multithreading observablecollection

71
推荐指数
4
解决办法
6万
查看次数

列出<T>在更改时触发事件

我创建了一个继承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中做事件接线?

当然,我可以将属性更改为"私有集",但我希望能够将该类用作变量.

.net c#

10
推荐指数
3
解决办法
4万
查看次数

Blazor(服务器端)在兄弟组件之间进行通信

我有三个组成部分。组件一包含组件二和三。组件二是一个列表。组件三用于向数据库添加项目。

当我将一个项目保存到数据库时,我想更新组件二中的列表。我怎么做?

blazor blazor-server-side

8
推荐指数
1
解决办法
1954
查看次数

C# - 有什么方法可以投射通用集合吗?

我一直忙于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接口如下所示: …

.net c# generics casting c#-4.0

6
推荐指数
1
解决办法
635
查看次数

当列表有新项目时引发事件?

我编写了一个显示项目列表的控件(在本例中只是字符串).我给开发人员一个项目列表,他可以添加和删除项目(参见下面的代码).我希望有一种方法可以在添加新项目时收到通知.因此,作为反应,控件可以更新.

private List<string> items = new List<string>();

public List<string> Items
{ get { return items; } }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?List<...>没有事件.我能做什么 ?

c# events list

2
推荐指数
2
解决办法
2601
查看次数

List&lt;T&gt;.Remove() 方法是否从删除对象中调用 Dispose() 方法?

我在集合列表中有几个对象。我需要知道从集合中删除对象时是否调用 Dispose() 方法?如果没有,当对象被删除时是否有某种方法可以调用它?

c#

1
推荐指数
1
解决办法
414
查看次数