web-dev-qa-db-ja.com

List <string> INotifyPropertyChangedイベント

文字列プロパティとリストプロパティを持つ単純なクラスがあり、INofityPropertyChangedイベントを実装していますが、文字列リストに.Addを実行すると、このイベントがヒットしないため、ListViewに表示するコンバーターがヒットしません。 Add to the Listで変更されたプロパティがヒットしないと思います...プロパティ変更イベントヒットを取得する方法でこれを実装するにはどうすればよいですか?

他のタイプのコレクションを使用する必要がありますか?!

助けてくれてありがとう!

namespace SVNQuickOpen.Configuration
{
    public class DatabaseRecord : INotifyPropertyChanged 
    {
        public DatabaseRecord()
        {
            IncludeFolders = new List<string>();
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void Notify(string propName)
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }
        #endregion

        private string _name;

        public string Name
        {
            get { return _name; }

            set
            {
                this._name = value;
                Notify("Name");
            }
        }

        private List<string> _includeFolders;

        public List<string> IncludeFolders
        {
            get { return _includeFolders; }

            set
            {
                this._includeFolders = value;
                Notify("IncludeFolders");
            }
        }
    }
}
22
theDoke

Listとは異なり、ObservableCollectionはその内容が変更されたときに依存オブジェクトに通知するため、ObservableCollection<string>ではなくList<string>を使用する必要があります。

そして、あなたの場合、私は_includeFoldersを読み取り専用にします-コレクションの1つのインスタンスでいつでも作業できます。

public class DatabaseRecord : INotifyPropertyChanged 
{
    private readonly ObservableCollection<string> _includeFolders;

    public ObservableCollection<string> IncludeFolders
    {
        get { return _includeFolders; }
    }

    public DatabaseRecord()
    {
        _includeFolders = new ObservableCollection<string>();
        _includeFolders.CollectionChanged += IncludeFolders_CollectionChanged;
    }

    private void IncludeFolders_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        Notify("IncludeFolders");
    }

    ...

}
37
bniwredyc

WPFのリストバインディングを機能させる最も簡単な方法は、INotifyCollectionChangedを実装するコレクションを使用することです。ここで行う簡単なことは、リストを ObservableCollection で置き換えるか、または変更することです。

ObservableCollectionを使用すると、リストを変更するたびに、CollectionChangedイベント(WPFバインディングに更新を通知するイベント)が発生します。実際のコレクションオブジェクトを交換する場合は、実際のコレクションプロパティのpropertychangedイベントを発生させる必要があることに注意してください。

8
Philip Rieck

リストがNotifyPropertyChangedイベントを自動的に発生させることはありません。

ItemsSourceプロパティを公開するWPFコントロールは、ObservableCollection<T>にバインドされるように設計されています。これは、項目が追加または削除されると自動的に更新されますwill

3
Adam Rackis

ObservableCollection を見てください。

2
Andrew Kennan