DataBinding 未在 WPF 窗口中显示我的有界数据源

问题描述 投票:0回答:1

我对 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
实例,但我没有找到正确的方法来处理它。

我已尝试以下步骤:

  1. 在MainWindow构造函数中设置DataContext
  2. 在 XAML 中使用
    Window.DataContext
    设置 DataContext -> 它告诉我
    Eingabe
    没有公共构造函数

编辑: 一些来自应用程序的图片

应用程序启动时的主窗口,以及在我按下

EingabeView
中的“Prüfen”(检查运输 ID)按钮(“Neu”按钮下的小图片)

MainWindow

EingabeView to fetch all needed data from DB

c# wpf xaml data-binding
1个回答
0
投票

绑定链中的每个属性都需要可观察(如果它有 setter)。你错过了这个:

公共 Versandauftrag Versandauftrag { 获取;放; }

Versandauftrag = 新 Versandauftrag{ Empfänger = 新 Empfänger { Referenz = "123"}

以及

Versandauftrag
的每一个属性(你的命名约定很糟糕,你是在设计软件,而不是写日记)。如果你可以设置它,它需要是可观察的。

这也提出了一个观点:也许并非所有事情都应该是可设置的。一个正确的设计应该是尽可能不可变的,特别是像

Versandauftrag.PackstückListe
这样的不可变属性——它已经是一个可观察的集合,设置它是糟糕的设计,如果需要的话只需调用
Clear()
即可。

© www.soinside.com 2019 - 2024. All rights reserved.