3

INotifyPropertyChangedを実装し、次のような独自のプロパティの概念を持つクラスがあります。

class sealed MyClass : INotifyPropertyChanged
{
    private Dictionary<string, object> _properties;

    public object GetProperty(string name)
    {
        return _properties[name];
    }

    public object SomeProperty
    {
        get
        {
            return GetProperty("SomeProperty");
        }
    }
}

一部の一般的なプロパティには、C# アクセサーもあることに注意してください。

このプロパティに対応する C# アクセサーがない場合でも、プロパティ (その値は GetProperty メソッドを介してアクセスされます) が変更されたことを他のユーザーに通知するイベントを発生させたいと考えています。

INotifyPropertyChanged.PropertyChanged衝突のリスクがないと仮定すると (つまり、値が変更されていない C# プロパティのプロパティ変更イベントを不注意に発生させる - このクラスは封印されていることに注意してください)、イベントを使用して通知できない理由はありますか?他の人、またはこの目的のために独自のイベントを追加する必要がありますか?

4

3 に答える 3

2

自分で追加することをお勧めします。コードが破損する特定の理由はありませんINotifyPropertyChangedが、特定の使用目的があり、多くの潜在的な消費者に理解されています。万が一に備えて、それと矛盾するコードを個人的に書くことはしません。

于 2012-08-15T14:06:17.647 に答える
0

技術的には、誰がサブスクライブしたか、イベントに応じてPropertyChangedをしたかによって異なります。PropertyChanged.NET の "プロパティ" を読み取ろうとしなければ問題ありません。

しかし、それは実際にはカップリングを導入し、INPC の使用はデカップリングを試みています。一般的なケースでの INPC は、PropertyChanged(特定の名前の) .NET プロパティが変更されたことを意味し、INPC を使用するすべての場所に当てはまると予想されます。つまり、INPC を受け入れる任意の場所でオブジェクトを使用したいので、INPC を実装します。オブジェクトがそれを実行できない場合、INPC の暗黙の契約に違反しています。プロパティの読み取りとは異なる処理を行うPropertyChangedハンドラーがあり、そこにあるという理由だけで INPC を再利用している場合は、独自のインターフェイスを作成することをお勧めします。

于 2012-08-15T14:38:47.407 に答える
0

私の知る限り、そこにPropertyChangedないプロパティを調達しても害はありませんが、あまり有用ではないと思います。INotifyPropertyChanged主にデータ バインディング システム (WinForms、WPF、Silverlight など) で使用されますが、これらのシステムはカスタムの「プロパティ」にアクセスする方法を知りません。

ここでできることはICustomTypeDescriptor、標準的な方法でカスタム プロパティへのアクセスを提供するように実装することです。これは Windows フォームと WPF で動作しますが、他のフレームワークについてはわかりません。

もちろん、これをデータ バインディングに使用しない場合でも、このイベントを使用して、値が変更されたことをクラスの消費者に通知できます。

于 2012-08-15T14:11:08.987 に答える