この方法で DP を実装します。
#region SomeProperty
/// <summary>
/// The <see cref="DependencyProperty"/> for <see cref="SomeProperty"/>.
/// </summary>
public static readonly DependencyProperty SomePropertyProperty =
DependencyProperty.Register(
SomePropertyPropertyName,
typeof(object),
typeof(SomeType),
// other types here may be appropriate for your situ
new FrameworkPropertyMetadata(null, OnSomePropertyPropertyChanged));
/// <summary>
/// Called when the value of <see cref="SomePropertyProperty"/> changes on a given instance of <see cref="SomeType"/>.
/// </summary>
/// <param name="d">The instance on which the property changed.</param>
/// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
private static void OnSomePropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as SomeType).OnSomePropertyChanged(e.OldValue as object, e.NewValue as object);
}
/// <summary>
/// Called when <see cref="SomeProperty"/> changes.
/// </summary>
/// <param name="oldValue">The old value</param>
/// <param name="newValue">The new value</param>
private void OnSomePropertyChanged(object oldValue, object newValue)
{
}
/// <summary>
/// The name of the <see cref="SomeProperty"/> <see cref="DependencyProperty"/>.
/// </summary>
public const string SomePropertyPropertyName = "SomeProperty";
/// <summary>
///
/// </summary>
public object SomeProperty
{
get { return (object)GetValue(SomePropertyProperty); }
set { SetValue(SomePropertyProperty, value); }
}
#endregion
DependencyProperty は、大量のジャンクが追加された単なるプロパティではなく、WPF バインディング システムへのフックであることを理解する必要があります。これは、DP が優雅に浮かぶ海面下に存在する広大で複雑なシステムです。実際に学習しない限り、予期しない方法で動作します。
私たち全員が DP で経験した最初の啓示を経験しています: バインディングは、プロパティ アクセサー (つまり、get
およびset
メソッド) を介して DependencyProperty 値にアクセスしません。これらのプロパティ アクセサーは、コードからのみ使用できる便利なメソッドです。それらを省略して、システムへの実際のフックであるDependencyObject.GetValue および DependencyObject.SetValueを使用できます (上記の例のゲッター/セッターの実装を参照してください)。
変更通知をリッスンしたい場合は、上記の例で行ったことを行う必要があります。DependencyProperty を登録するときに、変更通知リスナーを追加できます。変更通知を追加するために、継承された DependencyProperties の「メタデータ」をオーバーライドすることもできます (私はこれを常に行っています)。 DataContext
DependencyPropertyDescriptor
ただし、何をするにしても、DependencyPropertiesのget
およびメソッドにコードを追加しないでください。set
バインド操作では実行されません。
DependencyProperties の仕組みの詳細については、MSDN のこの優れた概要を読むことを強くお勧めします。