如何在不同的控件类型中实现依赖项属性值inheritance

A有一组我正在创建的自定义控件,每个控件都有各自控件的基类。 因为它们各自具有不同的基本控件,所以它们不能共享完全相同的依赖项属性。 是否可以将依赖属性链接在一起,以便它们可以相互级联? (不确定我是否正确使用术语级联语法)

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。 设置父控件的重映射颜色时,默认情况下该按钮不会级联。

    

您不应声明多个独立附加属性,因为它们之间不存在任何属性值inheritance。

相反,声明一个附加属性,并在控件类中使用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); } }