wpf binding attached-properties

Enlace de datos de propiedad adjunta de WPF



binding attached-properties (2)

Intento usar el enlace con una propiedad adjunta. Pero no puedo hacer que funcione.

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); } }

El código 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>

Y el error vinculante:

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'')


Créalo o no, solo agregue Path= y use paréntesis cuando se enlace a una propiedad adjunta:

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

Además, su llamada a RegisterAttached debe pasar en "Test" como el nombre de la propiedad, no como "TestProperty".


Hubiera preferido publicar esto como un comentario sobre la respuesta de Kent, pero como no tengo suficiente representante para hacerlo ... solo quería señalar que a partir de WPF 4.5, agregar Path= ya no es necesario. Sin embargo, el nombre de propiedad adjunto todavía debe estar entre paréntesis.