0

当我有这样的界面时:

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 事件为空。但是,将 BindingList 用于 MyClass 它不为空。为什么?

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

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

提前致谢。

4

1 回答 1

1

您的 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));
            }
        }

我测试了它。有用。

于 2013-03-14T12:16:59.740 回答