55 votes

La liaison à l'Auto/ " il " dans le code XAML

Simple WPF/XAML question. En XAML, comment dois-je faire référence Auto/cet objet dans un contexte donné? Dans un très basic application avec une fenêtre principale, un contrôle et un code C# de la propriété de la fenêtre, j'ai envie de lier une propriété du contrôle à la main codé propriété de la fenêtre.

Dans le code, c'est très facile - dans la Fenêtre du constructeur, j'ai ajouté ceci:

Binding bind = new Binding();
bind.Source = this;
bind.Path = new PropertyPath("ButtonWidth");
button1.SetBinding(WidthProperty, bind);

Évidemment, j'ai une propriété appelée ButtonWidth, et un contrôle appelé button1. Je ne peux pas comprendre comment le faire dans le code XAML. Diverses tentatives comme l'exemple suivant n'ont pas fonctionné:

<Button x:Name="button1" Width="{Binding Source=Self Path=ButtonWidth}"/>

<Button x:Name="button1" Width="{Binding RelativeSource={RelativeSource Self} Path=ButtonWidth}"/> 

etc

Merci

92voto

Arcturus Points 14366

Première utilisation d'une virgule entre le RelativeSource et le Chemin d'accès à votre Liaison:

<Button x:Name="button1" Width="{Binding RelativeSource={RelativeSource Self}, 
                                Path=ButtonWidth}"/> 

Deuxièmement, la RelativeSource se lie à la Touche. Le bouton n'a pas de propriété appelée ButtonWidth. Je devine que vous devez Lier à votre contrôle parent.

Donc, essayez cette RelativeSource de liaison:

<Button x:Name="button1" Width="{Binding RelativeSource=
    {RelativeSource FindAncestor, AncestorType={x:Type YourNamespace:YourParentControl}}, 
    Path=ButtonWidth}"/> 

44voto

Clint StLaurent Points 321

Je pense que ce que vous cherchez est ceci:

<Window x:Class = "blah blah all the regular stuff"

DataContext="{Binding RelativeSource={RelativeSource Self}}"

>

30voto

Damian Points 917

Une manière pour moi d'avoir à traiter avec RelativeSource et l'aime, c'est le nom de la racine de l'élément XAML:

<Window x:Class="TestApp2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    x:Name="_this"
    >
    <Grid>
        <Button x:Name="button" Width="{Binding ElementName=_this,Path=ButtonWidth}" />
    </Grid>
</Window>

Si vous souhaitez définir le DataContext vous pouvez aussi faire ceci:

<Window x:Class="TestApp2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    x:Name="_this"
    >
    <Grid DataContext="{Binding ElementName=_this}">        
        <Button x:Name="button" Width="{Binding Path=ButtonWidth}" />
    </Grid>
</Window>

Pour moi c'est une bonne astuce pour ne pas avoir à se souvenir de toutes les complexités de la RelativeSource de liaison.

2voto

Tom Davies Points 646

Très bien, merci. Qui fonctionne. C'est un peu verbeux, mais - cela pourrait-il être fait à la place en définissant la propriété DataContext de la fenêtre propriétaire? Si mon xaml lit simplement:

<Button x:Name="button1" Width="{Binding Path=ButtonWidth}"/>

Alors je peux faire ce travail en ajoutant la ligne suivante dans le constructeur de la Fenêtre:

DataConext=this;

Puis-je faire quelque chose de similaire dans le code xaml, quelque chose comme ceci:

<DataContext>Self</DataContext>
<Button x:Name="button1" Width="{Binding Path=ButtonWidth}"/>

Diverses tentatives de mise au DataContext de l'Auto/'ce' n'ont pas fonctionné pour moi.

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