は、私はこれをやっていた:Getterで独自のプロパティにPropertyChangedを呼び出すときの動作?
public string FirstName
{
get
{
//Actual Code was doing something to change the value here
this._FirstName = "Hello";
this.OnPropertyChanged("FirstName");
return this._FirstName;
}
set {
if (this._FirstName == value)
return;
this._FirstName = value;
this.OnPropertyChanged("FirstName");
}
}
あなたが見ることができるように、私は姓のプロパティ内のFirstNameプロパティの変更を募集します。私はこれが無限ループになることを期待していましたが、FirstName
ゲッターはそれ自身を呼び出し続けるでしょう。しかし、奇妙なことはは起こりません。
は、その後、私はBackgroundWorker
内昇給プロパティの変更を入れてみました:
public string _FirstName { get; set; }
public string FirstName
{
get
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
Thread.Sleep(2000);
};
worker.RunWorkerCompleted += (sender, e) =>
{
this._FirstName = "Hi Hi";
this.OnPropertyChanged("FirstName");
};
worker.RunWorkerAsync();
return this._FirstName;
}
set {
if (this._FirstName == value)
return;
this._FirstName = value;
this.OnPropertyChanged("FirstName");
}
}
あなたが行く、この時間は無限ループです。 しかし、なぜ最初のケースでは起こりませんか?
P.私はプログラムを中断しようとしていない、ちょうど私はいくつかの他の人々のプログラムをデバッグしている、彼らは最初のケースのようにここで何か類似していた。しかし、このプロパティは2回目の呼び出しではありません。
UPDATE:テストケース2について のStackTrace:
私は、テキストボックスに、このプロパティを結合することによってそれをテストし、FirstName
ゲッターにブレークポイントを設定し、私はブレークポイントが倍の無限hittedされて見ることができました。
at Person.get_FirstName()
at RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at CLRPropertyListener.get_Value()
at PropertyAccessPathStep.get_Value()
at PropertyPathListener.ReconnectPath()
at <>c__DisplayClass4.<BreakOnSharedType>b__3()
at RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder......
プロパティの値が変更されていないため、ゲッターでイベントを発生させるべきではありません。それはセッターでのみ発生する必要があります。 – Bernard
@Bernardこのコードは問題を単純化するためのものです。その人はゲッターの中でイベントを起こして値を変更する何かをしています。 –
悪いデザイン私は恐れています。 getter内のプロパティの値を変更しないでください。 – Bernard