Я создаю редактор BPMN с использованием WPF и должен включать, помимо прочего, набор различных типов task . Каждый тип задачи имеет некоторые общие свойства, но также включает некоторую информацию о типе c. Однако для данного элемента задачи пользователь должен иметь возможность изменить его тип, и даже информация, указывающая c на данный тип задачи, должна сохраняться между такими изменениями.
Поэтому я подумал о создании:
- один класс модели
TaskModel
, который будет объединять свойства всех типов задач - отдельный класс
XXXTaskViewModel
для каждого типа задачи, предоставляя только свойства, связанные с этим типом - общий класс
TaskView
, представляющий задачу как визуальный элемент на холсте редактора
Когда пользователь изменяет тип задачи (используя сетку свойств), a PropertyChanged
событие запускается, что обрабатывается в TaskView
для изменения DataContext
модели представления для новой.
Так как я совершенно новичок в C# и мне нужно реорганизовать и улучшить чужой код Мои первые вопросы:
- Является ли такой дизайн правильным, то есть соответствует ли принципам MVVM? Или, может быть, существуют другие лучшие шаблоны / решения, которые я мог бы использовать?
- Можно ли вообще обрабатывать
PropertyChanged
событий в представлении?
Я пытался реализовать INotifyPropertyChanged
на мой взгляд (для изменения DataContext
):
public partial class BaseElementView : DragableUserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public BaseElementView()
{
InitializeComponent();
PropertyChanged += PropertyChangedHandler;
}
private void PropertyChangedHandler(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine("A property has changed: " + e.PropertyName); // just a proof-of-concept
}
// ...
}
Однако PropertyChanged
фактически не перехватывается (хотя это же событие обрабатывается классом модели представления). Кроме того, я получаю подсказку анализатора кода:
Событие BaseElementView.PropertyChanged
никогда не используется.
Я не знаю, почему это произошло.