Доступ к переменной codebehind в XAML
Как я могу получить доступ к общедоступной переменной, которая в файле Sample.xaml.cs, например asp.net ?
- {x: Null} против прозрачного?
- Разница между TargetType = "controlType" и TargetType = "{x: Тип controlType}"
- Bind TextBox при нажатии клавиши Enter
- наследовать стиль от стиля по умолчанию
- WPF Combobox: различные шаблоны в текстовом поле и выпадающем списке
- Связывание в текстовом столбце таблицы данных WPF
- Объединить расширитель и сетку (изменяемый размер расширителя)
- Где Application.DoEvents () в WPF?
Есть несколько способов сделать это.
-
Добавьте свою переменную в качестве ресурса из codebehind:
myWindow.Resources.Add("myResourceKey", myVariable);
Затем вы можете получить к нему доступ из XAML:
Если вам нужно добавить его после того, как XAML получит синтаксический
DynamicResource
, вы можете использоватьDynamicResource
выше вместоStaticResource
. -
Сделайте переменную свойством чего-то в вашем XAML. Обычно это работает через
DataContext
:myWindow.DataContext = myVariable;
или
myWindow.MyProperty = myVariable;
После этого что-нибудь в вашем XAML может получить к нему доступ через
Binding
:или
Для привязки, если DataContext
не используется, вы можете просто добавить это к конструктору кода:
this.DataContext = this;
Используя это, каждое свойство в коде становится доступным для привязки:
Другой способ – просто указать имя корневому элементу XAML:
x:Name="root"
Поскольку XAML скомпилирован как неполный class кода, мы можем получить доступ к каждому свойству по имени:
Примечание: доступ доступен только для свойств; а не полям. set;
и get;
или {Binding Mode = OneWay}
. Если используется привязка OneWay, базовые данные должны реализовывать INotifyPropertyChanged .
Для быстрой и грязной Windows в WPF я предпочитаю привязывать DataContext windows к самому окну; все это можно сделать в XAML.
Window1.xaml
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, тогда вам придется использовать первый метод Роберта использования ресурсов в коде позади.