设置“hosted"控件模板中的依赖项属性不起作用

本文关键字:依赖 不起作用 属性 hosted quot 控件 设置 | 更新日期: 2023-09-27 18:05:42

我有下面的类,它"承载"一个依赖属性,它注册了所有类型的FrameWorkElement

在这里:

public class DPHost: DependencyObject
    {
        public static readonly DependencyProperty MyStringProperty = DependencyProperty.Register("MyString", typeof(String), typeof(FrameworkElement), new PropertyMetadata(OnMyStringChanged));
        public static String GetMyString(DependencyObject obj)
        {
            return (String)obj.GetValue(MyStringProperty);
        }
        public static void SetMyString(DependencyObject obj, String value)
        {
            obj.SetValue(MyStringProperty, value);
        }
        public String MyString
        {
            get { return (String)GetValue(MyStringProperty); }
            set { SetValue(MyStringProperty, value); }
        }

        private static void OnMyStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
    }

这个示例代码DOES WORK:

    <Border x:Name="_ErrorBorder" c:DPHost.MyString="ABC"/>

这个示例代码DOES NOT WORK:

<ControlTemplate.Triggers>
    <Trigger SourceName="_ImageCircle" Property="IsEnabled" Value="True">
        <Setter TargetName="_ErrorBorder" Property="c:DPHost.MyString" Value="ABC"/>
    </Trigger>
</ControlTemplate.Triggers>

代码确实编译,给定的触发器工作100%正确,但是当我使用上面的setter代码为"_ErrorBorder"时,我得到错误:

" System.Windows.Markup。XamlParseException occurred"

InnerException:HResult = -2147467261Message=该值不能为空Parametername:房地产ParamName =属性源= PresentationFramework加:贝System.Windows.Setter。CheckValidProperty (DependencyProperty属性)贝System.Windows.Baml2006.WpfSharedBamlSchemaContext灵活;> c。b__341_0(对象目标,对象值)贝System.Windows.Baml2006.WpfKnownMemberInvoker。SetValue(对象实例,对象值)贝MS.Internal.Xaml.Runtime.ClrObjectRuntime。SetValue(XamlMember成员,对象obj,对象值)贝MS.Internal.Xaml.Runtime.ClrObjectRuntime。SetValue(对象的属性,对象的值)InnerException:

我已经测试了直接在Border类型的类中实现"MyString"DP,然后它工作了。

我认为这是某种语法错误或DP系统的不同行为,当涉及到设置时,DP没有直接托管在用户控件内。

感谢您的任何提示或链接或完整的答案!

如果你好奇我想要实现什么:我喜欢在UserControl库中为所有类型的FrameWorkElement实现全局和中央dp。




这是这个问题的答案/解决方案:(非常感谢ibebbs花时间真正帮助我)

将owner类型从"FrameworkElement"更改为"DPHost",并让类DPHost继承FrameworkElement。

public class DPHost:FrameworkElement
    {
        public static readonly DependencyProperty MyStringProperty = DependencyProperty.RegisterAttached("MyString", typeof(String), typeof(DPHost), new PropertyMetadata(OnMyStringChanged));

        public static String GetMyString(DependencyObject obj)
        {
            return (String)obj.GetValue(MyStringProperty);
        }
        public static void SetMyString(DependencyObject obj, String value)
        {
            obj.SetValue(MyStringProperty, value);
        }
        private static void OnMyStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
    }

1。

<Border x:Name="_ErrorBorder"  c:DPHost.MyString="ABC"/>

2。现在也可以了(这是错误)

 <ControlTemplate.Triggers>
     <Trigger SourceName="_ImageCircle" Property="IsEnabled" Value="True">
        <Setter TargetName="_ErrorBorder"   Property="c:DPHost.MyString" Value="THE BORDER" />
        <Setter TargetName="_ImageCircle"   Property="c:DPHost.MyString" Value="THE CIRCLE"/>
     </Trigger>
  </ControlTemplate.Triggers>

3。简单解释一下

我需要为FrameworkElement所有类型的不同的依赖属性,而不创建任何新的基类。目标是实现一个通用的动画框架。所以这个"MyString"属性只是一个抽象的例子来帮助我,我想要实现的。

设置“hosted"控件模板中的依赖项属性不起作用

Michael,看看代码,看起来你实际上是在尝试定义一个'附加属性',而不是一个常规的依赖属性。我不能100%确定这将解决触发器/setter问题,但尝试一下也无妨。

还需要注意的是,代码中依赖属性的"所有者"是"FrameworkElement",而应该是"DPHost"。