Как я могу получить доступ к общедоступной переменной, которая в файле Sample.xaml.cs, например asp.net <%=VariableName%>
?
Доступ к переменной codebehind в XAML
Ответ 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.