INotifyPropertyChanged
変数が変更されたときにイベントを発生させるためにカスタム クラス内で使用しましたが、double などの単一の変数の変更でイベントを発生させる簡単な方法があるかどうか疑問に思っていました。
たとえば、WPF アプリでは、
private double a;
で、いつでもイベントを発生させる簡単なMainWindow.xaml.cs
方法はありますか?a
INotifyPropertyChanged
変数が変更されたときにイベントを発生させるためにカスタム クラス内で使用しましたが、double などの単一の変数の変更でイベントを発生させる簡単な方法があるかどうか疑問に思っていました。
たとえば、WPF アプリでは、
private double a;
で、いつでもイベントを発生させる簡単なMainWindow.xaml.cs
方法はありますか?a
フィールドには、変更を追跡する手段がありません。それを機能させるには、プロパティである必要があり、何かが追跡を処理する必要があります。INotifyPropertyChanged
それがインターフェースの目的です。
この値への変更を追跡する通常の手段はINotifyPropertyChanged
、クラスに実装することです。
a
私があなたを正しく理解していれば、a のセッターを作成する必要があります。これにより、クラスにカプセル化する代わりに、properychange イベント/カスタム イベントが発生します。
このようなもの:
private double a;
public double A
{
get { return a; }
set { a = value;
firepropertyChange(a);
}
}
C# 5.0 を使用している場合は、次のCallerMemberName
方法で属性を使用できます。
class MyData : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged();
}
}
private string _anotherProperty;
public string AnotherProperty
{
get { return _anotherProperty; }
set
{
_anotherProperty = value;
RaisePropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged([CallerMemberName] string caller = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
}
}
ご覧のとおり、プロパティ名を何度も入力せずに、各プロパティRaisePropertyChanged();
を呼び出すだけです。set
別のアプローチは、ModelBase
クラスを定義することです。
class ModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
{
if (!Object.Equals(field, value))
{
field = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
そして、モデルを次から派生させますModelBase
。
class Conf : ModelBase
{
NodeType _nodeType = NodeType.Type1;
public NodeType NodeType
{
get { return _nodeType; }
set { Set(ref _nodeType, value); }
}
}
はい(依存)、プロパティを介して変数アクセスをラップし、変更時にイベントを発生させ、その変数へのすべてのアクセスがプロパティを介して行われるようにする場合
private double a;
public double PropertyA
{
get
{
return a;
}
set
{
// set value and fire event only when value is changed
// if we want to know when value set is the same then remove if condition
if (a != value)
{
a = value;
PropertyChanged("PropertyA");
}
}
}
// when changing a, make sure to use the property instead...
PropertyA = 5.2;
...そうでなければ、いいえ