51 votes

Accéder à une variable codebehind dans XAML

Comment puis-je accéder à la variable publique qui, dans Sample.xaml.cs fichier comme asp.net <%=VariableName%> ?

2 votes

Cette question peut également être utile puisqu'il est un peu plus récent ...

69voto

Robert Macnee Points 6998

Il y a plusieurs façons de procéder.

  • Ajoutez votre variable comme une ressource de codebehind :

    myWindow.Resources.Add("myResourceKey", myVariable);

    Vous pouvez ensuite y accéder à partir de XAML :

    <TextBlock Text="{StaticResource myResourceKey}"/>

    Si vous devez l'ajouter après que le XAML ait été analysé, vous pouvez utiliser une balise DynamicResource ci-dessus au lieu de StaticResource .

  • Faites de la variable une propriété de quelque chose dans votre XAML. En général, cela se fait par le biais de la fonction DataContext :

    myWindow.DataContext = myVariable;

    ou

    myWindow.MyProperty = myVariable;

    Après cela, tout ce qui se trouve dans votre XAML peut y accéder par l'intermédiaire d'un fichier Binding :

    <TextBlock Text="{Binding Path=PropertyOfMyVariable}"/>

    ou

    <TextBlock Text="{Binding ElementName=myWindow, Path=MyProperty}"/>

27voto

yossharel Points 609

Pour la liaison, si DataContext n'est pas utilisé, vous pouvez simplement ajouter ceci au constructeur du code derrière :

this.DataContext = this;

En utilisant cela, chaque propriété dans le code devient accessible à la liaison :

<TextBlock Text="{Binding PropertyName}"/>

Une autre méthode consiste à donner un nom à l'élément Root du XAML :

x:Name="root"

Puisque le XAML est compilé comme une classe partielle du code-behind, nous pouvons accéder à chaque propriété par son nom :

<TextBlock Text="{Binding ElementName="root" Path=PropertyName}"/>

Remarque : l'accès n'est disponible que pour les propriétés, pas pour les champs. set; y get; o {Binding Mode = OneWay} sont nécessaires. Si la liaison OneWay est utilisée, les données sous-jacentes doivent mettre en œuvre la norme INotifyPropertyChanged .

1 votes

Merci ! Cette réponse m'a aidé. Je ne pouvais pas utiliser la méthode DataContext parce que je crée un contrôle utilisateur et que si je définissais le contexte de données dans mon contrôle, celui-ci ne pourrait pas obtenir le contexte de données de ses parents lorsque je l'utiliserais dans des applications. La liaison directe à la racine m'a donné le même résultat que celui que je recherchais et laisse le contexte de données de mon contrôle intact.

0 votes

Merci pour le conseil "Root". Cela fonctionne malgré le fait que les propriétés du code-behind ne sont pas listées dans le concepteur de liens visuels, ce qui est un peu déroutant.

10voto

Phil Price Points 1441

Pour les fenêtres rapides dans WPF, je préfère lier le DataContext de la fenêtre à la fenêtre elle-même ; tout cela peut être fait en XAML.

Window1.xaml

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding RelativeSource={RelativeSource self}}"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <TextBlock Text="{Binding Path=MyProperty1}" />
        <TextBlock Text="{Binding Path=MyProperty2}" />
        <Button Content="Set Property Values" Click="Button_Click" />
    </StackPanel>
</Window>

Window1.xaml.cs

public partial class Window1 : Window
{
    public static readonly DependencyProperty MyProperty2Property =
        DependencyProperty.Register("MyProperty2", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));

    public static readonly DependencyProperty MyProperty1Property =
        DependencyProperty.Register("MyProperty1", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));

    public Window1()
    {
        InitializeComponent();
    }

    public string MyProperty1
    {
        get { return (string)GetValue(MyProperty1Property); }
        set { SetValue(MyProperty1Property, value); }
    }

    public string MyProperty2
    {
        get { return (string)GetValue(MyProperty2Property); }
        set { SetValue(MyProperty2Property, value); }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Set MyProperty1 and 2
        this.MyProperty1 = "Hello";
        this.MyProperty2 = "World";
    }
}

Dans l'exemple ci-dessus, notez la liaison utilisée dans l'élément DataContext sur la fenêtre, cela dit "Définissez votre contexte de données à vous-même". Les deux blocs de texte sont liés à MyProperty1 y MyProperty2 le gestionnaire d'événements pour le bouton définira ces valeurs, qui se propageront automatiquement dans l'interface de l'utilisateur. Text des deux blocs de texte car les propriétés sont des propriétés de dépendance.

3voto

Sheridan Points 26778

Il convient également de noter qu'un "Binding" ne peut être défini que sur une DependencyProperty d'un DependencyObject. Si vous souhaitez définir une propriété autre qu'une propriété de dépendance (par exemple, une propriété normale) sur un objet en XAML, vous devrez utiliser la première méthode de Robert pour utiliser les ressources dans le code.

1voto

Pixel_95 Points 759

myWindow.xaml

<Window
    ...
    <TextBlock Text="{ Binding Path=testString }" />
</Window>

myWindow.xaml.cs

public partial class myWindow: Window
{
    public string testString { get; set; } = "This is a test string";

    public myWindow()
    {
        DataContext = this;
        InitializeComponent();
    }
}

Important

  • Définir Datacontext
  • testString MUST être public
  • testString MUST être un property (avoir un get y set )

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