Доступ к переменной codebehind в XAML - PullRequest
46 голосов
/ 20 марта 2009

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

Ответы [ 4 ]

62 голосов
/ 20 марта 2009

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

  • Добавьте вашу переменную как ресурс из 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}"/>
    
24 голосов
/ 23 ноября 2009

Для связывания, если 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 .

9 голосов
/ 22 марта 2009

Для быстрых и грязных Windows в WPF я предпочитаю привязывать DataContext of the Window к самому окну; все это можно сделать в 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 в Window, там написано: «Установите свой контекст данных для себя». Два текстовых блока привязаны к MyProperty1 и MyProperty2, обработчик события для кнопки установит эти значения, которые автоматически распространятся на свойство Text двух TextBlocks, поскольку свойства являются свойствами зависимости.

3 голосов
/ 25 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...