-1

我想列出 Listbox 控件中的项目。从抽象基类派生的项目。另外,我需要支持2路绑定。

名为“Animal”的基类。被称为“狗”和“猫”的继承类具有独特的属性。在列表框中更改所选项目时,我想预览派生项目的属性。

基类:

public abstract class Animal : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string _Name { get; set; }
    public virtual string Name { get; set; }


    private int _Id;
    public int Id
    { 
        get
        {
            return _Id;

        }
        set
        {
            _Id = value;
            OnPropertyChanged("Id");
        }
    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}    

狗类

public class Dog  : Animal
{
    public override string Name
    {
        get
        {
            return _Name;
        }
        set
        {
            _Name = value;
            OnPropertyChanged("Name");
        }
    }

}

猫类

public class Cat : Animal
{
    public override string Name
    {
        get
        {
            return _Name;
        }
        set
        {
            _Name = value;
            OnPropertyChanged("Name");
        }
    }

    private string _uniqueCatProp;
    public string uniqueCatProp
    {
        get
        {
            return _uniqueCatProp;
        }
        set
        {
            _uniqueCatProp = value;
            OnPropertyChanged("uniqueCatProp");
        }
    }
}

形式:

这是我的表格 表格代码:

public Form1()
    {
        InitializeComponent();

        BindingList<Animal> animals = new BindingList<Animal>();


        Dog d1 = new Dog();
        d1.Id = 1;
        d1.Name = "dog1";

        Dog d2 = new Dog();
        d2.Id = 2;
        d2.Name = "dog2";

        Cat c1 = new Cat();
        c1.Id = 3;
        c1.Name = "cat1";
        c1.uniqueCatProp = "clean";

        animals.Add(d1);
        animals.Add(d2);
        animals.Add(c1);

        BindingSource bs = new BindingSource();
        bs.DataSource = typeof(Animal);

        foreach (var item in animals)
        {
            bs.Add(item);
        }

        listBox1.DataSource = bs;
        listBox1.DisplayMember = "Name";
        listBox1.ValueMember = "Name";

        Binding ctx1 = new Binding("Text", listBox1.DataSource, "Id", true, DataSourceUpdateMode.OnPropertyChanged);
        textBox1.DataBindings.Add(ctx1);

        Binding ctx2 = new Binding("Text", listBox1.DataSource, "Name", true, DataSourceUpdateMode.OnPropertyChanged);
        textBox2.DataBindings.Add(ctx2);

当我添加以下行时,绑定被破坏:

Binding ctx3 = new Binding("Text", listBox1.DataSource, "uniqueCatProp", true, DataSourceUpdateMode.OnPropertyChanged);
        textBox3.DataBindings.Add(ctx3);

我知道 Animal 基类中不存在属性“uniqueCatProp”,但是我认为我不应该在基类中添加另一个名为“uniqueCatProp”的虚拟属性。

需要你的帮助。

4

1 回答 1

0

动物类型看不到 _uniqueCatProp 或 uniqueCatProp

listBox1.DataSource 必须是 Cat 才能工作

Animal a = new Cat();

a.uniqueCatProp  // ERROR since Animal has no uniqueCatProp 

解决方案是将 uniqueCatProp 添加到 Animal 或制作 Cat 类型的 DataSource

于 2017-08-01T06:47:11.607 回答