Доступ к переменной codebehind в XAML

Как я могу получить доступ к общей переменной, которая в образец.код XAML.cs файл, как asp.net <%=VariableName%>?

4 ответов


есть несколько способов сделать это.

  • добавьте переменную в качестве ресурса из codebehind:

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

    тогда вы можете получить к нему доступ из XAML:

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

    Если вам нужно добавить его после анализа XAML, вы можете использовать DynamicResource выше вместо StaticResource.

  • сделайте переменную свойство в XAML. Обычно это работает через DataContext:

    myWindow.DataContext = myVariable;
    

    или

    myWindow.MyProperty = myVariable;
    

    после этого все в вашем XAML может получить к нему доступ через Binding:

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

    или

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

для привязки, если DataContext не используется, Вы можете просто добавить его в конструктор код:

this.DataContext = this;

используя это, каждое свойство в коде становится доступным для привязки:

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

другой способ-просто дать имя корневому элементу XAML:

x:Name="root"

поскольку XAML компилируется как частичный класс кода, мы можем получить доступ к каждому свойству по имени:

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

Примечание: доступ доступен только для свойства; не полям. set; и get; или {Binding Mode = OneWay} необходимы. Если используется привязка OneWay, базовые данные должны реализовать INotifyPropertyChanged.


для быстрых и грязных окон в WPF я предпочитаю привязывать DataContext окна к самому окну; все это можно сделать в 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";
    }
}

в приведенном выше примере обратите внимание на привязку, используемую в DataContext свойство в окне, это говорит "установите контекст данных для себя". Два текстовых блока привязаны к MyProperty1 и MyProperty2 обработчик событий для кнопка установит эти значения, которые будут автоматически распространяться на Text свойство двух текстовых блоков, поскольку свойства являются свойствами зависимостей.


также стоит отметить, что "привязка" может быть установлена только на DependencyProperty DependencyObject. Если вы хотите установить Non DependencyProperty (например. обычное свойство) на объекте в XAML, то вам придется использовать первый метод Роберта использования ресурсов в коде позади.