我花了几个小时在这上面。我已经阅读了有关数据绑定的文档并做了很多研究。有人向我指出了其他一些类似的问题,但虽然他们给了我一些指示,但它们似乎都无法帮助解决我的特定用例。这不是重复的!我不想为显示传递到窗口的对象的一些属性的简单表单实现完整的 M-V-MV 架构。我确实想使用数据绑定,如果有人能指出我到底做错了什么,我将不胜感激。
我正在尝试使用 WPF 窗口进行数据绑定,并将一个简单的对象存储为 Windows 类的属性。
我有一个名为 Car 的类,其属性名为 Make(即大众、奥迪等)。
public class Car : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _make;
public string Make
{
get => _make;
set
{
_make = value;
OnPropertyChanged();
}
}
public Car()
{ Make = "Empty";}
}
在 WPF 表单的 XAML 中,我有一个设置为绑定到 Make 的文本框
<TextBox Text="{Binding Make}"/>
在 WPF 窗体的代码隐藏中,windows 构造函数和 Car 属性是
public WindowCarDetails()
{
// instantiate the private property that contains the class.
// An empty car has "Empty" as its make
_car = new Car();
InitializeComponent();
this.DataContext = _car;
}
private Car _car;
public Car Car
{
get => _car;
set
{
_car = value;
}
}
在上一个窗口中,我实例化了窗口并将一辆车传递给窗口的 Car 属性。我已经检查过了,这确实成功地传递了汽车详细信息
WindowCarDetails CarDetails = new();
CarDetails.Car = (Car)CarDataGrid.CurrentItem ;
当我对此进行测试时,我发现文本字段的值确实为“Empty”,因此它采用了我创建的空 Car 实例的默认值。但是,它应该显示传递到窗口的 Car 实例的品牌。
我尝试删除 _car=New Car();行,然后文本框就是空白的。
但是,如果我将汽车类作为窗口的一部分,它确实可以工作,但我不想这样做,因为它将窗口与类的生成混合在一起!
有人可以告诉我为什么代码不显示 _cars Make 属性的值吗?
谢谢!
WindowCarDetails 中的 Car 属性是多余的。删除它并简单地写
WindowCarDetails CarDetails = new();
CarDetails.DataContext = (Car)CarDataGrid.CurrentItem;
如果出于某种原因您需要保留 Car 属性,则其设置器显然必须更新 DataContext:
public Car Car
{
get => _car;
set
{
_car = value;
DataContext = _car;
}
}