web-dev-qa-db-fra.com

Code d'accès derrière une variable en XAML

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

47
Murat

Il y a quelques façons de le faire.

  • Ajoutez votre variable en tant que ressource de codebehind:

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

    Ensuite, vous pouvez y accéder à partir de XAML:

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

    Si vous devez l'ajouter après l'analyse du XAML, vous pouvez utiliser un DynamicResource ci-dessus au lieu de StaticResource.

  • Faites de la variable une propriété de quelque chose dans votre XAML. Habituellement, cela fonctionne via DataContext:

    myWindow.DataContext = myVariable;
    

    ou

    myWindow.MyProperty = myVariable;
    

    Après cela, tout ce qui se trouve dans votre XAML peut y accéder via un Binding:

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

    ou

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

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

this.DataContext = this;

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

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

Une autre façon consiste simplement à donner un nom à l'élément racine du XAML:

x:Name="root"

Étant donné que le XAML est compilé en tant que 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 est uniquement disponible pour les propriétés; pas aux champs. set; et get; ou {Binding Mode = OneWay} sont nécessaires. Si la liaison OneWay est utilisée, les données sous-jacentes doivent implémenter INotifyPropertyChanged.

24
yossharel

Pour Windows rapide et sale 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 la propriété DataContext dans la fenêtre, cela indique "Définissez votre contexte de données pour vous-même". Les deux blocs de texte sont liés à MyProperty1 et MyProperty2, le gestionnaire d'événements du bouton définira ces valeurs, qui se propageront automatiquement à la propriété Text des deux TextBlocks car les propriétés sont des propriétés de dépendance.

9
Phil Price

Il convient également de noter qu'une "liaison" ne peut être définie que sur une propriété de dépendance d'un objet de dépendance. Si vous souhaitez définir une propriété non dépendante (par exemple, une propriété normale) sur un objet en XAML, vous devrez utiliser la première méthode de Robert d'utilisation des ressources dans le code derrière.

3
Sheridan