使用DataGridView和BindingList其中T是接口和跨线程更新

本文关键字:接口 线程 更新 DataGridView BindingList 使用 其中 | 更新日期: 2023-09-27 18:03:57

当我有一个像这样的界面时:

public interface IClass
{
    string { get; set;}
}

和继承接口的类:

using System.Runtime.CompilerServices;
public class MyClass : INotifyPropertyChanged : IClass
{
    private string name;
    public event PropertyChangedEventHandler PropertyChanged;
    public string Name
    {
        get { return name;}
        set
        {
            name = value;
            this.NotifyPropertyChanged();
        }
    }    
    public MyClass(string name)
    {
        this.Name = name;
    }
    private void NotifyPropertyChanged([CallerMemberName] string caller = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
        }
    }
}

我将一个DataGridView数据源绑定到一个BindingList,如下所示:

BindingList<MyClass> classes = new BindingList<MyClass>();
MyClass testClass = new MyClass("test1");
MyClass testClass = new MyClass("test2");
classes.Add(testClass);
dataGridView1.DataSource = classes;

每当name属性从另一个表单更改时,datagridview都会更新。但是,当我尝试执行以下操作时,它不起作用。

BindingList<IClass> classes = new BindingList<IClass>();
MyClass testClass = new MyClass("test");
MyClass testClass = new MyClass("test2");
classes.Add(testClass);
dataGridView1.DataSource = classes;

我可能已经跟踪了这个问题,当我为IClass使用BindingList时,PropertyChanged事件在更新属性时为空。然而,对于MyClass使用BindingList,它不是空的。为什么?

这个想法是这样的,可能有MyClassA, MyClassB等具有相同的属性,可以显示在datagridview

附加问题:如果MyClass在非ui线程中运行并进行更新怎么办?我必须保留对主表单或线程编组控件的引用吗?或者这只是糟糕的设计?

使用DataGridView和BindingList<T>其中T是接口和跨线程更新

你的MyClass同时继承了INotifyPropertyChanged和IClass。这就是当你在BindingList中使用MyClass时触发PropertyChanged事件的原因。

另一方面,IClass不继承INotifyPropertyChanged,所以它不能访问它的PropertyChanged事件处理程序。这就是为什么当你在BindingList中使用IClass时PropertyChanged事件不会触发。

尝试像这样改变继承顺序。

public interface IClass : INotifyPropertyChanged 
    {
        string Name { get; set;}
    }

public class MyClass: IClass
    {
        private string name;
        public event PropertyChangedEventHandler PropertyChanged;
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                this.NotifyPropertyChanged("Name");
            }
        }
        public MyClass(string name)
        {
            this.Name = name;
        }
        private void NotifyPropertyChanged(string caller = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(caller));
            }
        }

我测试过。它的工作原理。