2017-09-30 1 views
0

それぞれに、それぞれのコントロールの基本クラスを持つカスタムコントロールのコレクションがあります。それらはそれぞれ異なる基本コントロールを持っているため、まったく同じ依存関係プロパティを共有することはできません。依存関係プロパティを相互にカスケードできるようにリンクすることは可能ですか? (私が正しく文法ワイズ用語カスケードを使用している場合はわからない)異なるコントロールタイプの依存関係プロパティ値の継承を実装する方法

public class RCTWindow : ContentControl { 
    public static readonly DependencyProperty RemapColorProperty = 
     DependencyProperty.RegisterAttached(
     "RemapColor", 
     typeof(RemapColors), 
     typeof(RCTWindow), 
     new FrameworkPropertyMetadata(
      RemapColors.SeaGreen, 
      FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
      new PropertyChangedCallback(OnVisualChanged))); 
    //... 
} 
public class RCTButton : Button { 
    public static readonly DependencyProperty RemapColorProperty = 
     DependencyProperty.RegisterAttached(
     "RemapColor", 
     typeof(RemapColors), 
     typeof(RCTButton), 
     new FrameworkPropertyMetadata(
      RemapColors.SeaGreen, 
      FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
      new PropertyChangedCallback(OnVisualChanged))); 
    //... 
} 

ここXAMLです。親コントロールの再マップ色を設定するとき、ボタンはデフォルトでカスケードしません。

<local:RCTWindow RemapColor="IndianRed"> 
    <local:RCTButton/> 
</local:RCTWindow> 
+0

ここで実際に継承を話しているようには聞こえません。プロパティの値を親から子に「カスケード」したいのと同じように聞こえますが、CSSの仕組みと同様に正しいですか? 'RCTWindow'で設定した' RemapColor'値を 'RCTButton'に表示します。 –

+0

はい、これは正しいです、私はそれの正しい言葉を理解していないと思います。私はタイトルと説明を更新します。 –

+0

私は "親から子へのコントロールからDependancyPropertyの値をカスケードする方法"を提案します。私は実際の公式の名前があるかどうかはわかりません。 –

答えて

3

複数の独立した添付プロパティは、それらの間にプロパティ値の継承がないため、宣言しないでください。

代わりに、1つの添付プロパティを宣言し、コントロールクラスでDependencyProperty.AddOwnerを使用します。

public static class RCT 
{ 
    public static readonly DependencyProperty RemapColorProperty = 
     DependencyProperty.RegisterAttached(
      "RemapColor", typeof(RemapColors), typeof(RCT), 
      new FrameworkPropertyMetadata(RemapColors.SeaGreen, 
       FrameworkPropertyMetadataOptions.Inherits | 
       FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

    public static RemapColors GetRemapColor(DependencyObject obj) 
    { 
     return (RemapColors)obj.GetValue(RemapColorProperty); 
    } 

    public static void SetRemapColor(DependencyObject obj, RemapColors value) 
    { 
     obj.SetValue(RemapColorProperty, value); 
    } 
} 

public class RCTButton : Button 
{ 
    public static readonly DependencyProperty RemapColorProperty = 
     RCT.RemapColorProperty.AddOwner(
      typeof(RCTButton), new FrameworkPropertyMetadata(OnVisualChanged)); 

    public RemapColors RemapColor 
    { 
     get { return (RemapColors)GetValue(RemapColorProperty); } 
     set { SetValue(RemapColorProperty, value); } 
    } 

    private static void OnVisualChanged(
     DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     Debug.WriteLine("RCTButton.OnVisualChanged: {0}", ((RCTButton)obj).RemapColor); 
    } 
} 

public class RCTWindow : ContentControl 
{ 
    public static readonly DependencyProperty RemapColorProperty = 
     RCT.RemapColorProperty.AddOwner(
      typeof(RCTWindow), new FrameworkPropertyMetadata(OnVisualChanged)); 

    public RemapColors RemapColor 
    { 
     get { return (RemapColors)GetValue(RemapColorProperty); } 
     set { SetValue(RemapColorProperty, value); } 
    } 

    private static void OnVisualChanged(
     DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     Debug.WriteLine("RCTWindow.OnVisualChanged: {0}", ((RCTWindow)obj).RemapColor); 
    } 
} 
+0

ありがとう!これは私がそれを必要としたときとまったく同じです! –

関連する問題