2011-04-29 13 views
52

Intento utilizar el enlace con una propiedad adjunta. Pero no puedo hacer que funcione.Enlace de datos de propiedades adjuntas 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); 
    } 
} 

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 Encuadernación:

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

Respuesta

137

creas o no, sólo tiene que añadir Path= y usar paréntesis cuando se une a una propiedad asociada:

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

Además, su llamada al RegisterAttached debe pasar en "Prueba" como el nombre de la propiedad, no como "Probar propiedad".

+0

Ya lo intenté y obtuve una excepción: Der Eigenschaftspfad ist ungültig. \ "Adjunto \" besitzt keine öffentliche Eigenschaft mit dem Namen \ "Test \". -> Engl: el Propertypath no es válido. "Adjunto" no posee una propiedad pública "Prueba" – SACO

+9

La llamada 'RegisterAttached' debería pasar 'Test', no 'TestProperty' como el nombre de la propiedad. –

+0

... bien ... bien, gracias. Ahora todo funciona bien – SACO

15

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

+0

estaba a punto de publicar esto como un comentario, no me di cuenta de que esta es una característica de WPF 4.5 y superior ... ¡es bueno saberlo, gracias! –

+0

No estoy seguro de por qué, pero WPF se bloquea si no agrego Path = y estoy ejecutando WPF 4.5 Estoy ejecutando Win 8.1 – Mo0gles

+0

Incluso con .NET 4.5 o .NET 4.6 No puedo hacerlo funcionar sin ' Path = 'cuando se vincula a propiedades adjuntas en DataTriggers. –

Cuestiones relacionadas