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

Answer #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".


Answer #2

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.