设置“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"属性只是一个抽象的例子来帮助我,我想要实现的。Michael,看看代码,看起来你实际上是在尝试定义一个'附加属性',而不是一个常规的依赖属性。我不能100%确定这将解决触发器/setter问题,但尝试一下也无妨。
还需要注意的是,代码中依赖属性的"所有者"是"FrameworkElement",而应该是"DPHost"。