在XAML中访问代码隐藏variables
如何访问Sample.xaml.cs文件中的公共variables,如asp.net <%= VariableName%>?
有几种方法可以做到这一点。
-
从代码隐藏中添加variables作为资源:
myWindow.Resources.Add("myResourceKey", myVariable);
那么你可以从XAML访问它:
<TextBlock Text="{StaticResource myResourceKey}"/>
如果必须在XAMLparsing后添加它,则可以使用上面的
DynamicResource
而不是StaticResource
。 -
将variables设置为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中的快速和肮脏的Windows,我宁愿将窗口的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
,button的事件处理程序将设置这些值,这些值将自动传播到两个TextBlocks的Text
属性,因为属性是依赖项属性。
值得注意的是,“绑定”只能在DependencyObject的DependencyProperty上设置。 如果你想在XAML的对象上设置一个非DependencyProperty(例如一个普通的属性),那么你将不得不在后面的代码中使用Robert的第一个使用资源的方法。