我是 WPF 新手,我正在尝试弄清楚数据绑定是如何工作的,但我运气不太好。
我尝试从简单的事情开始 - 将文本框的内容绑定到程序中的字符串变量。
我阅读了很多关于数据绑定、XML 命名空间、标记扩展、资源、依赖属性等等的 MSDN 文档,但我仍然无法让它工作。
这是我的 MainWindow.xaml:
<Window x:Class="WpfTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:WpfTest"
Title="MainWindow">
<Grid>
<Grid.Resources>
<c:Foo x:Key="MyFoo"/>
</Grid.Resources>
<TextBox Width="100" Height="28"
Text="{Binding Source=MyFoo,
Path=BarProperty,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
还有我的 MainWindow.xaml.cs:
namespace WpfTest
{
public class Foo : DependencyObject
{
public static readonly DependencyProperty BarProperty = DependencyProperty.Register("Bar", typeof(String), typeof(Foo));
public String Bar
{
get { return (String)GetValue(BarProperty); }
set { SetValue(BarProperty, value); }
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyFoo = new Foo { Bar = "hello" };
}
public Foo MyFoo { get; set; }
}
}
我希望程序启动时文本框会显示“hello”,但它是空的。
有人可以告诉我我做错了什么吗?
您需要将窗口的
DataContext
设置为自身。
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
MyFoo = new Foo { Bar = "hello" };
}
这告诉 WPF 在您的类中查找绑定。
每个控件都可以设置一个
DataContext
,它表示“当我绑定时,我想绑定到此特定实例上的属性...这是继承的,因此如果将 DataContext
的 MainWindow
设置为自身, MainWindow
内的所有控件都将绑定到 MainWindow
上的属性。
您需要注明来源。要么:
为窗口命名,例如 Name="mywin",用 ElementName="myWin" 更改绑定
或者设置窗口 DataContext 如下:
DataContext="{Binding ElementName="myWin"} - 如果您不想要该名称,您也可以使用相对源,我只是无法未经测试地发布它 - 正如您也注意到的那样,绑定往往需要测试:)