2011-04-29 199 views
52

我嘗試使用綁定與附加屬性。但不能得到它的工作。WPF附加屬性數據綁定

public class Attached 
{ 
    public static DependencyProperty TestProperty = 
     DependencyProperty.RegisterAttached("TestProperty", typeof(bool), typeof(Attached), 
     new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Inherits)); 

    public static bool GetTest(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(TestProperty); 
    } 

    public static void SetTest(DependencyObject obj, bool value) 
    { 
     obj.SetValue(TestProperty, value); 
    } 
} 

的XAML代碼:

<Window ...> 
    <StackPanel local:Attached.Test="true" x:Name="f"> 
     <CheckBox local:Attached.Test="true" IsChecked="{Binding (local:Attached.Test), Mode=TwoWay, RelativeSource={RelativeSource Self}}" /> 
     <CheckBox local:Attached.Test="true" IsChecked="{Binding (local:Attached.Test), Mode=TwoWay}" /> 
    </StackPanel> 
</Window> 

並且綁定錯誤:

System.Windows.Data Error: 40 : BindingExpression path error: '(local:Attached.Test)' property not found on 'object' ''StackPanel' (Name='f')'. BindingExpression:Path=(local:Attached.Test); DataItem='StackPanel' (Name='f'); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1') 

回答

137

信不信由你,只是添加Path=並用括號綁定到一個附加屬性時:

IsChecked="{Binding Path=(local:Attached.Test), Mode=TwoWay, RelativeSource={RelativeSource Self}}" 

此外,您撥打RegisterAttached的電話應以「測試」作爲屬性名稱,而不是「TestProperty」。

+0

我已經試過這個,並得到一個例外:Der Eigenschaftspfad istungültig。 「附件」besitzt keineöffentlicheEigenschaft mit dem Namen \「Test \」。 - > Engl:屬性無效。 「附加」不擁有公共屬性「測試」 – SACO 2011-04-29 13:07:16

+9

「RegisterAttached」調用應通過「Test」,而不是「TestProperty」作爲屬性名稱。 – 2011-04-29 15:22:09

+0

...對...好的,謝謝。現在一切正常。 – SACO 2011-05-02 08:36:36

15

我寧願發表這個評論肯特的答案,但因爲我沒有足夠的代表這樣做...只是想指出,從WPF 4.5,加入Path=是沒有必要的了。但是附加的屬性名稱仍然需要用圓括號包裝。

+0

即將發佈此評論我自己,沒有意識到,這是一個WPF 4.5和功能...很高興知道,謝謝! – 2013-12-03 21:16:37

+0

不知道爲什麼,但WPF崩潰,如果我不添加Path =並且正在運行WPF 4.5 我正在運行Win 8.1 – Mo0gles 2014-01-16 10:29:49

+0

即使使用.NET 4.5或.NET 4.6,我也無法讓它在沒有' Path ='綁定到DataTriggers中的附加屬性時。 – 2016-03-03 14:20:16