C# WP7:绑定到附加属性

C# WP7:绑定到附加属性,c#,data-binding,windows-phone-7,dependency-properties,C#,Data Binding,Windows Phone 7,Dependency Properties,我正在尝试将数据值绑定到附加属性。然而,它就是不能让它工作 我对它的定义如下: public static class MyClass { public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.RegisterAttached("MyProperty", typeof(string), typeof(MyClass), new PropertyMe

我正在尝试将数据值绑定到附加属性。然而,它就是不能让它工作

我对它的定义如下:

public static class MyClass
{
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(string),
        typeof(MyClass), new PropertyMetadata(null));

    public static string GetMyProperty(DependencyObject d)
    {
        return (string)d.GetValue(MyPropertyProperty);
    }

    public static void SetMyProperty(DependencyObject d, string value)
    {
        d.SetValue(MyPropertyProperty, value);
    }
}
现在我使用的XAML看起来像这样:

<TextBlock local:MyClass.MyProperty="{Binding MyStringValue}" />

我在SetMyProperty方法中设置了一个断点,但从未调用它。它不会引起任何错误,只是从未设置或要求。但是,如果我将XAML中的值更改为固定字符串,则会调用它:

<TextBlock local:MyClass.MyProperty="foobar" />

我错过了什么

注意:上面的示例是显示相同奇怪行为的最小版本。当然,我的实际实现比这更有意义


提前感谢您的任何提示

将SetMyProperty中第二个参数的类型更改为Object类型


您将获得一个绑定对象,而不是字符串作为其中的值。

将SetMyProperty中第二个参数的类型更改为type object


您将获得一个绑定对象,而不是字符串,作为其中的值。

并且绑定永远不会触发您的SetMyProperty-如果您需要控制值何时更改,则必须使用预期“更改”处理程序的覆盖


而且绑定永远不会触发SetMyProperty——如果需要控制值何时更改,则必须使用预期“更改”处理程序的覆盖


谢谢你的回复。刚试过,但还是不行。这是错误的。您永远不会得到绑定对象,他的dp类型为string,因此SetMyPropert也应该需要string。WPF/silverlight将跟踪如何以及何时评估绑定以获得dp或ap的有效值。感谢您的回复。刚试过,但还是不行。这是错误的。您永远不会得到绑定对象,他的dp类型为string,因此SetMyPropert也应该需要string。WPF/silverlight将跟踪如何以及何时评估绑定以获取dp或ap.AFAIR的有效值,即使get/set是必需的WPF/silverlight可能不会直接调用它们。这就是为什么没有命中断点,因为WPF/Silverlight正在使用反射(只是猜测)或直接使用SetValue。你说它不会工作,值正确吗,但断点没有命中?那就正常了。很抱歉,在MSDN中找不到这个的来源,但我知道我在什么地方读到过。@dowhilefor:那是有道理的。我只是在搜索时没有找到任何关于它的信息……在get/set声明中有一个错误,应该是:return(string)d.GetValue(MyPropertyProperty);不,它(silverlight)不使用反射-这是WPF/silverlight中属性系统的工作方式-数据不在对象中,但在一种静态类中,绑定将在其中更改此值,而不是在实例上,实例中的getter/setter也在使用此值(GetValue/SetValue)@Philip Daubmeier最后我发现它可以查找AFAIR,即使Get/set是必需的,WPF/Silverlight可能不会直接调用它们。这就是为什么没有命中断点,因为WPF/Silverlight正在使用反射(只是猜测)或直接使用SetValue。你说它不会工作,值正确吗,但断点没有命中?那就正常了。很抱歉,在MSDN中找不到这个的来源,但我知道我在什么地方读到过。@dowhilefor:那是有道理的。我只是在搜索时没有找到任何关于它的信息……在get/set声明中有一个错误,应该是:return(string)d.GetValue(MyPropertyProperty);不,它(silverlight)不使用反射-这是WPF/silverlight中属性系统的工作方式-数据不在对象中,但在一种静态类绑定中,会在其中更改此值,而不是在您的实例上,并且实例中的getter/setter也在使用此值(GetValue/SetValue)@Philip Daubmeier最终我找到了它


... new PropertyMetadata(
    null,
    new PropertyChangedCallback((sender, e) => {
      var myThis = (MyClass)sender;
      var changedString = (string)e.NewValue;
      // To whatever you like with myThis ( = the sender object) and changedString (= new value)
    })