我对 XAML、WPF、MVVM 等概念很陌生。首先,也许对我糟糕的英语技能感到抱歉:P
我的任务是创建一个接受用户输入的应用程序。我的主窗口是一个带有一些文本框、按钮和标签的用户窗体。这些文本框绑定到类“
Versandauftrag
”(英语->发货订单)的实例。反过来,该实例具有一些属性,这些属性是来自其他自定义类的对象,例如收件人、发件人、建议...
举例说明:
public class Versandauftrag
private UpdateBase? _update; <--- Class for INotifyPropertyChanged
public string? ID {get;set;}
public Empfänger? Empfänger { get; set; } <---- Addressee
public Avis? Avis { get; set; } <---- Advice
public Versender? Versender { get; set; } <--- Addressor
public Abholung? Abholung { get; set; }
public ObservableCollection<Packstück>? PackstückListe { get; set; } <--- List with items
public Packstück? SelectedPackstück { get; set; } = null;
public Versandauftrag()
{
this._update = new UpdateBase();
}
这里以
Addresse
类为例:
public class Empfänger : UpdateBase
{
private Address adresse = new Address();
public Address Adresse
{
get { return adresse; }
set
{
if (value != adresse)
{
adresse = value;
OnPropertyChanged();
}
}
}
private string? _referenz;
public string? Referenz...
private string? _kundennr;
public string? Kundennr ...
private bool isPrivate;
public bool IsPrivate ...
我的
ViewModel
课程是Eingabe
(输入)。
public class Eingabe : UpdateBase
//some commands
public MainWindow MainWindow { get; set; }
public Versandauftrag Versandauftrag { get; set; }
private string lastJob;
public string LastJob...
public Eingabe(MainWindow main)
{ MainWindow = main;
MainWindow.DataContext = this; <--- this was one attempt to get the real bounded instance
Versandauftrag = new Versandauftrag{ Empfänger = new Empfänger { Referenz = "123"}
};
主窗口:
public partial class MainWindow : Window
public Eingabe EingabeVM { get; set; }
public MainWindow()
{
InitializeComponent();
DataBaseConnection.initDB();
EingabeVM = new Eingabe(this);
this.btnVersenden.Click += EingabeVM.VersendenButton_Click;
this.txtNameVersender.SelectionChanged += EingabeVM.txtNameVersender_SelectionChanged;
this.btnNeu.Click += EingabeVM.neuButton_Click;
}
XAML 文本框示例:
<TextBox x:Name="txtPLZ" Text="{Binding Path=Versandauftrag.Empfänger.Adresse.Zip , UpdateSourceTrigger=PropertyChanged}" Width="54" FontSize="16" />
我在
MainWindow
初始化时从 Eingabe
设置 DataContext(在构造函数中)。主窗口上有一个“新建”按钮,用于打开一个新表单,该表单从数据库中获取相关数据。该数据填充了 Versandauftrag
中的每个属性(全部位于正确的位置和顺序)。这一切都发生在 EingabeView
类中,该类具有 Eingabe
的属性。 EingabeView
的构造函数采用 Eingabe
的实例,将其设置为类型 Eingabe
的私有属性。初始化后,它将所有获取的数据设置到实例<EingabeProperty>.Versandauftrag.x
。
我的主窗口应该在文本框中显示所有获取的数据,但它不显示任何数据。我猜绑定没有绑定到正确的
Versandauftrag
实例,但我没有找到正确的方法来处理它。
我已尝试以下步骤:
Window.DataContext
设置 DataContext -> 它告诉我 Eingabe
没有公共构造函数编辑: 一些来自应用程序的图片
应用程序启动时的主窗口,以及在我按下
EingabeView
中的“Prüfen”(检查运输 ID)按钮(“Neu”按钮下的小图片)
绑定链中的每个属性都需要可观察(如果它有 setter)。你错过了这个:
公共 Versandauftrag Versandauftrag { 获取;放; }
Versandauftrag = 新 Versandauftrag{ Empfänger = 新 Empfänger { Referenz = "123"}
以及
Versandauftrag
的每一个属性(你的命名约定很糟糕,你是在设计软件,而不是写日记)。如果你可以设置它,它需要是可观察的。
这也提出了一个观点:也许并非所有事情都应该是可设置的。一个正确的设计应该是尽可能不可变的,特别是像
Versandauftrag.PackstückListe
这样的不可变属性——它已经是一个可观察的集合,设置它是糟糕的设计,如果需要的话只需调用 Clear()
即可。