在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属性中使用的绑定,这就是“设置你的数据上下文给你自己”。 两个文本块绑定到MyProperty1MyProperty2 ,button的事件处理程序将设置这些值,这些值将自动传播到两个TextBlocks的Text属性,因为属性是依赖项属性。

值得注意的是,“绑定”只能在DependencyObject的DependencyProperty上设置。 如果你想在XAML的对象上设置一个非DependencyProperty(例如一个普通的属性),那么你将不得不在后面的代码中使用Robert的第一个使用资源的方法。