【问题标题】:Attached Properties in XAML without the word 'Property'XAML 中没有“属性”一词的附加属性
【发布时间】:2011-04-25 18:01:06
【问题描述】:

MS 定义了附加属性,如“Grid.RowProperty”和“Grid.ColumnProperty”,但在 XAML 中,您只需使用“Grid.Row”和“Grid.Column”来调用它

我尝试对名为“MyValProperty”的附加属性执行相同操作,该属性在“Foo”类上以名称“MyVal”注册,但 XAML 不允许我键入“Foo.MyVal”,而是让我输入键入“Foo.MyValProperty” MS 是如何做到的?我错过了什么?

【问题讨论】:

  • 你能分享一下代码 sn-p...吗?

标签: wpf xaml attached-properties


【解决方案1】:

作为背景,这里是register an attached property

public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
    "IsBubbleSource",
    typeof(Boolean),
    typeof(AquariumObject),
    new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetIsBubbleSource(UIElement element, Boolean value)
{
    element.SetValue(IsBubbleSourceProperty, value);
}
public static Boolean GetIsBubbleSource(UIElement element)
{
    return (Boolean)element.GetValue(IsBubbleSourceProperty);
}

您还可以使用标准属性格式而不是 Set/Get 构造。这是 WPF 具有强大约定的领域之一。 AttachedProperty(或任何DependencyProperty)包含三个部分。首先是使用DependencyProperty.RegisterAttached 注册属性,返回值应设置为名为[Property Name]Property 的公共静态变量。第二个是注册属性时的第一个参数应该是“[Property Name]”。第三个是用于与外界交互的 Get/Set 方法,应命名为 Get[Property Name], Set[Property Name]。

如果您按照约定进行设置,WPF 将识别出两者是连接的,并且应该允许您按预期使用该属性。

【讨论】:

  • 哈!我以为我已经正确注册了。我做到了,但我不小心在 GetXxx/SetXxx 静态调用中使用了错误的名称(我有 GetXxxProperty/SetXxxProperty)。我的监督。标记为答案。
  • 顺便说一句,您说“您还可以使用标准属性格式而不是 Set/Get 构造。”没想到你可以用附加属性做到这一点。有例子吗?
  • 嗯,我想你可以,但我没有在可用的代码中找到任何示例。当然,我不经常使用附加属性,所以我会坚持使用有效的方法。
  • 是的...不确定你能不能,因为 getter 和 setter 是静态的。当然,您可能可以使它们成为扩展方法,但 C# 中没有扩展属性。另外,有些参数我很确定会排除使用属性。尽管如此,您还是准确地表明我的 getter/setter 有错误的名称,从而停止了 XAML 的编译(当您想到它时这很奇怪,因为 runtile 上的 XAML 无论如何都会绕过它并使用您注册它的名称!去图!)
  • 好的,我编辑了答案以删除对标准属性的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多