Aktualisieren von Fremdschlüsseln und verwandten Dingen in WPF DataGridC#

Ein Treffpunkt für C#-Programmierer
Guest
 Aktualisieren von Fremdschlüsseln und verwandten Dingen in WPF DataGrid

Post by Guest »

Hallo, ich muss eine Liste der Lieferungen in DataGrid anzeigen, indem ich MVVM und Entity Framework in einer WPF-Anwendung verwende. Jeder Lieferung ist ein Kurier zugeordnet, der über den Dialog EditWindow geändert werden kann. Es funktioniert alles gut, alle Informationen zur Lieferung wie Name werden sofort nach dem Aufruf von SaveChanges korrekt in einer Datenbank gespeichert und in einem DataGrid aktualisiert. Das einzige Problem besteht darin, dass der Courier-Name in einem DataGrid nicht aktualisiert wird, wenn der zugewiesene Courier in einen anderen geändert wird. Ich habe zu Testzwecken eine Spalte mit CourierUid-Daten hinzugefügt, aber selbst diese Eigenschaft wird in einem DataGrid nicht aktualisiert. Aber es wird auch korrekt in einer Datenbank gespeichert und natürlich werden alle Informationen nach dem erneuten Öffnen meiner Bewerbung aktualisiert. Keine Ahnung, was ich falsch mache.
Hier ist der Code:
Delivery.cs

Code: Select all

    public class Delivery : INotifyPropertyChanged
{
string nameDelivery = string.Empty;

string? courierUid = null;

public string DeliveryUid { get; set; } = Guid.NewGuid().ToString();

public string NameDelivery
{
get { return nameDelivery; }
set
{
nameDelivery = value;
OnPropertyChanged("NameDelivery");
}
}

public string? CourierUid
{
get { return courierUid; }
set
{
courierUid = value;
OnPropertyChanged("CourierUid");
OnPropertyChanged("NameCourierFull");
}
}

public Courier? Courier { get; set; }

public string NameCourierFull { get { return Courier?.NameCourierFull ?? string.Empty; } }

public event PropertyChangedEventHandler? PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
}
Courier.cs

Code: Select all

    public class Courier : INotifyPropertyChanged
{
string nameFirst = string.Empty;
string nameSecond = string.Empty;
string nameThird = string.Empty;

public string CourierUid { get; set; } = Guid.NewGuid().ToString();

public string NameFirst
{
get { return nameFirst; }
set
{
nameFirst = value;
OnPropertyChanged("NameFirst");
OnPropertyChanged("NameCourierFull");
}
}

public string NameSecond
{
get { return nameSecond; }
set
{
nameSecond = value;
OnPropertyChanged("NameSecond");
OnPropertyChanged("NameCourierFull");
}
}

public string NameThird
{
get { return nameThird; }
set
{
nameThird = value;
OnPropertyChanged("NameThird");
OnPropertyChanged("NameCourierFull");
}
}

public string NameCourierFull => $"{NameFirst} {NameSecond} {NameThird}";

public ICollection Deliveries { get; set; } = [];

public event PropertyChangedEventHandler? PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
}
DeliveryViewModel.cs (hier zählt nur der Bearbeitungsbefehl, die Datei ist zu groß)

Code: Select all

public RelayCommand EditDeliveryCommand
{
get
{
return editDeliveryCommand ??=
new RelayCommand((selectedItem) =>
{
if (selectedItem is not Delivery dbDelivery) return;

Delivery delivery = new()
{
DeliveryUid = dbDelivery.DeliveryUid,
NameDelivery = dbDelivery.NameDelivery,
CourierUid = dbDelivery.CourierUid
};

WindowEditDelivery window = new(delivery, Couriers);
if (window.ShowDialog() == true)
{
dbDelivery.NameDelivery = delivery.NameDelivery;
Courier? courierNew = db.Couriers.FirstOrDefault(c =>  c.CourierUid == delivery.CourierUid);
dbDelivery.Courier = courierNew;
db.Entry(dbDelivery).State = EntityState.Modified;
db.SaveChanges();
}
}
);
}
}

WindowEditDelivery.xaml (Dialogfenster zum Bearbeiten der Lieferung)

Code: Select all


















OK
Отмена


WindowEditDelivery.cs

Code: Select all

    public partial class WindowEditDelivery : Window
{
public Delivery Delivery { get; private set; }

public WindowEditDelivery(Delivery delivery, ObservableCollection Couriers)
{
InitializeComponent();
Delivery = delivery;
DataContext = Delivery;
ComboBoxCourier.ItemsSource = Couriers;
}

private void Accept_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
}
MainWindow.xaml

Code: Select all

































MainWindow.cs

Code: Select all

    public partial class MainWindow : Window
{
private DeliveryViewModel context;

public MainWindow()
{
InitializeComponent();

context = new DeliveryViewModel();
DataContext = context;
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post