2016-11-30 5 views
0

私はToggleButtonから派生したカスタムコントロールを持っており、基底クラスにDPをラップしたいと思います。
私は同じ両方の方法を動作するようですが、いずれかが存在する場合、私は知らない継承された依存関係プロパティをラップする正しい方法

public new bool IsEnabled 
{ 
    get { return base.IsEnabled; } 
    set 
    { 
     base.IsEnabled = value; 
     if (value && IsChecked == null) 
      IsChecked = false; 
    } 
} 

...

public new bool IsEnabled 
{ 
    get { return (bool)GetValue(IsEnabledProperty); } 
    set 
    { 
     SetValue(IsEnabledProperty, value); 
     if (value && IsChecked == null) 
      IsChecked = false; 
    } 
} 

か、これはokです...これを実行する必要がありますか隠された問題。

答えて

1

依存性プロパティーのCLRラッパーでGetValueおよびSetValue以外を呼び出してはなりません。理由は、MSDNのXAML Loading and Dependency Propertiesの記事で説明されています。

代わりに新しいCLRラッパーを追加するので、あなたは別のPropertyChangedCallbackを登録するために、基本クラスの依存関係プロパティフィールド上AddOwnerを呼び出すことができます。

public class MyToggleButton : ToggleButton 
{ 
    static MyToggleButton() 
    { 
     IsEnabledProperty.AddOwner(typeof(MyToggleButton), 
      new FrameworkPropertyMetadata(IsEnabledPropertyChanged)); 
    } 

    private static void IsEnabledPropertyChanged(
     DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     var myToggleButton = (MyToggleButton)o; 

     if ((bool)e.NewValue && !myToggleButton.IsChecked.HasValue) 
     { 
      myToggleButton.IsChecked = false; 
     } 
    } 
} 
+0

OKは、理にかなって、私の余分なロジックは同じ要素内にある場合にのみベースDPが変化するので、これは完璧です。 –

+0

明確化の1つのポイント: 'AddOwner'の2番目の引数の型は' PropertyMetadata'です。特定のオーバーロードがないときに提供されているメタデータを 'AddOwner'がどのように知っていますか? ...)? –

+0

これは[備考のセクションはこちら](https://msdn.microsoft.com/en-us/library/ms597484(v = vs.110).aspx)で説明しています(最後の段落)。 – Clemens

関連する問題