厳密な名前のOnPropertyChanged
OnPropertyChangedに怒り狂っています。 識別子名を含む文字列を渡す必要があります...このコードはコンパイラによって検証されないだけでなく、Intellisenceもありません-識別子全体を最初から最後までタップします...そして、あなたが悪くなると、実行時に飲み込まれます。 一般的に、悪いことです。 しかし、MVVMなしのWPFのように、MVVMなしでは、どこにもありません。
最後の問題は、OnPropertyChangedから呼び出された、
ここから引き裂か
れた松葉杖で少なくとも解決されました。
[Conditional( "DEBUG" )]
[DebuggerStepThrough]
public void VerifyPropertyName( string propertyName)
{
// Verify that the property name matches a real,
// public, instance property on this object.
if (TypeDescriptor.GetProperties( this )[propertyName] == null )
{
string msg = "Invalid property name: " + propertyName;
if ( this .ThrowOnInvalidPropertyName)
throw new Exception(msg);
else
Debug.Fail(msg);
}
}
そして今日、それを取り除く美しい方法を偶然見つけました。
解決策は美しく、同時に単純であることがわかりました。次のようにExpressionを使用します。
this .OnPropertyChanged(() => this .ShowOverrideButton);
これを行うには、基本クラスでオーバーロードを作成するだけです。
protected void OnPropertyChanged<T>(Expression<Func<T>> property)
{
PropertyChangedEventHandler handler = this .PropertyChanged;
if (handler != null )
{
var expression = property.Body as MemberExpression;
if (expression == null )
{
throw new NotSupportedException( "Invalid expression passed. Only property member should be selected." );
}
handler( this , new PropertyChangedEventArgs(expression.Member.Name));
}
}
* This source code was highlighted with Source Code Highlighter .
できた OnPropertyChangeの行を忘れることがあります。 バインディングのXAMLにはまだ悪い行があります-しかし、私はそれらをどのように取り除くか全く分かりません。
All Articles