73 votes

Liaison de données de propriété attachée WPF

J'essaie d'utiliser la liaison avec une propriété attachée. Mais je ne peux pas le faire fonctionner.

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

Le code 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>
 

Et l'erreur de reliure:

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

179voto

Kent Boogaart Points 97432

Croyez-le ou non, ajoutez simplement Path= lors de la liaison à une propriété attachée:

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

En outre, votre appel à RegisterAttached devrait passer dans "Test" en tant que nom de propriété, pas "TestProperty".

19voto

Livven Points 546

J'aurais préféré poster cela en tant que commentaire sur la réponse de Kent, mais comme je n'ai pas assez de représentants pour le faire ... je voulais simplement souligner qu'à partir de WPF 4.5, ajouter Path= isn ' t plus nécessaire. Toutefois, le nom de la propriété attachée doit toujours être entouré de parenthèses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X