如何将数据上下文定义从代码隐藏移动到 XAML
本文关键字:隐藏 代码 移动 XAML 定义 数据 上下文 | 更新日期: 2023-09-27 18:33:30
我定义了一个对象,该对象包含代码隐藏中的属性,并希望在xaml中将该对象设置为datacontext。
namespace WpfApplication4
{
public partial class MainWindow : Window
{
public EquipInfo equip1;
public MainWindow()
{
InitializeComponent();
equip1 = new EquipInfo();
// setting here works fine but i want to do in xaml
//textBox1.DataContext = equip1;
}
}
}
这是 XAML 代码。
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Text="{Binding Path=PIN}" Height="23"
HorizontalAlignment="Left" Margin="172,208,0,0"
Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>
</Window>
可以通过 XAML 将 DataContext 设置为公共属性。 BlindMeis给出了一个关于如何做到这一点的很好的例子。
您在帖子中所做的不是设置 DataContext,而是将控件的文本属性绑定到窗口的属性。这仅在设置了数据上下文时才有效。如果您不想使用 MVVM(不过我建议这样做),另一种方法是在绑定中引用特定的元素:
1.) 将成员更改为自动属性或类似内容
public EquipInfo equip1 {get;set;}
2.)给你的窗口起个名字
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="myWin"
Title="MainWindow" Height="350" Width="525">
2.) 按实例名称访问窗口属性
<TextBox Text="{Binding ElementName=myWin, Path=equip1.PIN}"/>
附带说明一下,最好改用 MVVM。
当你在代码隐藏中创建你的equipinfo类时,为什么不在那里设置数据上下文呢?
不过,您可以在 XAML 中创建数据上下文(当时您不需要代码隐藏的东西)
<TextBox Text="{Binding Path=PIN}">
<TextBox.DataContext>
<local:equip1/>
</TextBox.DataContext>
</TextBox>
但请查看 MVVM 模式
当你在代码隐藏中创建你的equipinfo类时,为什么不在那里设置数据上下文呢?
MVVM 的全部意义在于使用视图模型代理将 UI 与代码隐藏分开。如果要引用 ui 元素来设置其数据上下文,不妨引用它来设置其值,而忘记 mvvm。