绑定附属物

时间:2013-11-04 13:56:59

标签: c# wpf attached-properties

我正在尝试将Button的ContentTemplate绑定到附加属性。我读了所有问题的答案,类似于“绑定到附属物”,但我没有解决问题的运气。

请注意,此处提供的示例是我的问题的一个愚蠢版本,以避免混淆业务代码的问题。

所以,我确实有附加属性的静态类:

using System.Windows;

namespace AttachedPropertyTest
{
  public static class Extender
  {
    public static readonly DependencyProperty AttachedTextProperty = 
      DependencyProperty.RegisterAttached(
        "AttachedText",
        typeof(string),
        typeof(DependencyObject),
        new PropertyMetadata(string.Empty));

    public static void SetAttachedText(DependencyObject obj, string value)
    {
      obj.SetValue(AttachedTextProperty, value);
    }

    public static string GetAttachedText(DependencyObject obj)
    {
      return (string)obj.GetValue(AttachedTextProperty);
    }

  }
}

和一个窗口:

<Window x:Class="AttachedPropertyTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:AttachedPropertyTest"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Button local:Extender.AttachedText="Attached">
      <TextBlock 
        Text="{Binding 
          RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button},
          Path=(local:Extender.AttachedText)}"/>
    </Button>
  </Grid>
</Window>

这就是它。我希望在按钮中间看到“附加”。 相反,它会崩溃:属性路径无效。 “Extender”没有名为“AttachedText”的公共属性。

我在SetAttachedText和GetAttachedText上设置了断点,并且执行了SetAttachedText ,因此将其附加到按钮可以正常工作。 GetAttachedText永远不会被执行,所以它在解析时找不到属性。

我的问题实际上更复杂(我正在尝试从App.xaml中的Style内部进行绑定)但是让我们从简单的开始。

我错过了什么吗? 谢谢,

1 个答案:

答案 0 :(得分:7)

您附加的财产注册错误。 ownerType Extender,而非DependencyObject

public static readonly DependencyProperty AttachedTextProperty = 
    DependencyProperty.RegisterAttached(
        "AttachedText",
        typeof(string),
        typeof(Extender), // here
        new PropertyMetadata(string.Empty));

请参阅RegisterAttached的MSDN文档:

  

ownerType - 正在注册依赖项属性的所有者类型