使用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线程中运行并进行更新怎么办?我必须保留对主表单或线程编组控件的引用吗?或者这只是糟糕的设计?
你的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));
}
}
我测试过。它的工作原理。