WPF TextBlock не обновляется при изменении свойства вложенной модели представления с помощью команды кнопкиC#

Место общения программистов C#
Anonymous
WPF TextBlock не обновляется при изменении свойства вложенной модели представления с помощью команды кнопки

Сообщение Anonymous »

Я создаю приложение-менеджер рецептов в WPF, используя шаблон MVVM для школьного проекта. Приложение позволяет добавлять новые рецепты через текстовые поля и отображать их в списке.
Каждый рецепт имеет три поля: «Имя», «Категория» и «Калориен». Проект разделен на три отдельных уровня в соответствии со стандартом MVVM — Model, ViewModel и View как отдельные проекты в одном решении.
Базовая функциональность работает нормально. Рецепты загружаются при запуске, в списке они отображаются правильно, а нажатие кнопки «Добавить» создает новый рецепт и добавляет его в список. Текстовые поля ввода также очищаются после нажатия кнопки, что говорит мне о том, что уведомления PropertyChanged работают правильно для свойств ввода в VMMainWindow.
Проблема начинается, когда я выбираю элемент из списка и пытаюсь отобразить его сведения в текстовых блоках ниже. Текстовые блоки привязаны к SelectedRezept.Name, SelectedRezept.Kategorie и SelectedRezept.Kalorien.
При первом выборе они показывают правильные значения, что означает, что сам путь привязки правильный и SelectedRezept установлен правильно.
Однако при запуске метода, который изменяет одно из этих свойств выбранного VMRezept объект, текстовый блок не обновляется. Я могу подтвердить в отладчике, что базовое значение изменяется — пользовательский интерфейс просто не улавливает это.
Отображение обновляется только в том случае, если я нажимаю на другой элемент и затем повторно выбираю исходный, что означает, что WPF не уведомляется об изменении свойства.
Я заметил, что мои установщики в VMRezept вообще не вызывают PropertyChanged — они просто передают значение напрямую в модель. У меня есть вспомогательный метод OnPropertyChanged, определенный в VMRezept, но я никогда его нигде не вызываю. Я не уверен, является ли это основной причиной или реальная проблема заключается в том, что PropertyChanged в дочернем объекте модели представления не перемещается автоматически в родительский VMMainWindow, где находится привязка.
Я попробовал снова запустить PropertyChanged для SelectedRezept из VMMainWindow после вызова метода, и это приводит к обновлению текстовых блоков, но уведомлять об этом кажется неправильным что весь выбранный объект изменился, хотя на самом деле изменилось только одно свойство внутри него.
Мои вопросы:
  • Должен ли каждый установщик в VMRezept вызывать PropertyChanged, даже если значения поступают из уровня модели?
  • Вызывает ли вручную повторный запуск PropertyChanged для SelectedRezept из родительского элемента является стандартным подходом или существует более чистый шаблон для этого?
  • PropertyChanged в дочерней модели представления когда-либо автоматически распространяется на привязки в родительском элементе, или WPF прослушивает только объект, с которым он напрямую связан?
Вот мой код:
using Model;
using System.ComponentModel;

namespace ViewModel
{
public class VMRezept : INotifyPropertyChanged
{
private Rezept rezept;
public event PropertyChangedEventHandler? PropertyChanged;

public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}

public string Name
{
get => rezept.Name;
set
{
rezept.Name = value;
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Name)));
}
}

public string Kategorie
{
get => rezept.Kategorie;
set
{
rezept.Kategorie = value;
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Kategorie)));
}
}

public int Kalorien
{
get => rezept.Kalorien;
set
{
rezept.Kalorien = value;
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Kalorien)));
}
}

public VMRezept(string n, string kat, int kal)
{
rezept = new Rezept(n, kat, kal);
}

public override string ToString()
{
return rezept.ToString();
}
}
}

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