3

オブジェクトのコレクションにデータバインドされたリストボックスがあります。これらのオブジェクトのどれがプログラムの START オブジェクトであるかをユーザーに示すために、項目の表示方法を変更したいと考えています。

これを次の方法で実行しようとしましたが、リストボックスが自動的に更新されません。コントロールの無効化も機能しませんでした。

私が見つけることができる唯一の方法は、データバインディングを完全に削除して再度追加することです。しかし、私の場合、それは望ましくありません。

別の方法はありますか?

class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string Name
    {
        get
        {
            if (PersonManager.Instance.StartPerson == this)
                return _name + " (Start)";                      
            return _name;
        }
        set
        {
            _name = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

    public Person(string name)
    {
        Name = name;
    }
}

リストとスタートとなるアイテムを管理するクラスです

class PersonManager
{
    public BindingList<Person> persons { get; set; }
    public Person StartPerson { get; set; }

    private static PersonManager _instance;
    public static PersonManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new PersonManager();
            }
            return _instance;
        }
    }

    private PersonManager()
    {
        persons = new BindingList<Person>();
    }
}

フォームでは、次のコードを使用します

    private void button1_Click(object sender, EventArgs e)
    {
        PersonManager.Instance.StartPerson = (Person)listBox1.SelectedItem;
    }
4

1 に答える 1

3

問題は、これを行うと、実質的に Person.Name プロパティの「get」アクセサーに値を変更させていることです (UI に関する限り、set アクセサーのように動作します)。

ただし、これが起こっていると言うためにバインディングを更新しているものは何もありません。開始を設定したときに PropertyChanged が呼び出された場合、これは更新されると思います。

不格好ですが、あなたが書いた方法で、これを追加して機能させることができると思います(注:これをテストしていないため、問題がある可能性があります):

private void button1_Click(object sender, EventArgs e)
{
    Person newStart = (Person)listBox1.SelectedItem;
    if (newStart != null)
    {
        PersonManager.Instance.StartPerson = newStart;
        newStart.Name = newStart.Name; // Dumb, but forces a PropertyChanged event so the binding updates
    }
}
于 2009-03-12T14:50:21.433 に答える