Обновление внешних ключей и связанных с ними вещей в WPF DataGridC#

Место общения программистов C#
Ответить
Anonymous
 Обновление внешних ключей и связанных с ними вещей в WPF DataGrid

Сообщение Anonymous »

Привет, мне нужно показать список доставок в DataGrid, используя MVVM и Entity Framework в приложении WPF. У каждой доставки есть назначенный Курьер, которого можно изменить через диалоговое окно EditWindow. Все работает хорошо, вся информация о доставке, например имя, правильно сохраняется в базе данных сразу после вызова SaveChanges и обновляется в DataGrid. Единственная проблема заключается в том, что при изменении назначенного курьера на другого имя курьера не обновляется в DataGrid. Я добавил столбец с данными CourierUid для целей тестирования, но даже это свойство не обновляется в DataGrid. Но он также правильно сохраняется в базе данных, и, конечно же, вся информация обновляется после повторного открытия моего приложения. Понятия не имею, что я делаю не так.
Вот код:
Delivery.cs
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
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 (здесь важна только команда редактирования, файл слишком большой)
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 (диалоговое окно для редактирования доставки)


















OK
Отмена




WindowEditDelivery.cs
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



































MainWindow.cs
public partial class MainWindow : Window
{
private DeliveryViewModel context;

public MainWindow()
{
InitializeComponent();

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


Подробнее здесь: https://stackoverflow.com/questions/793 ... f-datagrid
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»