Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

  • Добавьте свою переменную в качестве ресурса из 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}"/>
    

Ответ 2

Для привязки, если 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.

Ответ 3

Для быстрой и грязной Windows в 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 двух текстовых блоков, так как свойствами являются свойства зависимостей.

Ответ 4

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