Этот заголовок может не подходить для самого вопроса, но оставайтесь со мной Я изменю его, если у вас есть предложение получше. Это мое первое приложение WPF, поэтому я мог пропустить некоторые ключевые концепции ... Я сделал Google, но мне не удалось найти правильный подход.
Я создаю приложение wpf с использованием MvvM Light и MUI, и у меня возникли проблемы с привязками элементов, то есть связью между моделями представления. Теперь я уверен, что у меня не было бы этой проблемы, если бы я использовал одну модель View для страницы и всех пользовательских элементов управления в ней, но я думаю, что переборщил с первой попытки.
У меня есть одно главное окно в приложении и страницы в качестве пользовательских элементов управления. На каждой странице у меня есть несколько других пользовательских элементов управления, и каждый из них имеет свою собственную модель представления и свою собственную логику для работы, но в конечном итоге все они зависят от соответствующей виртуальной машины с сеткой данных. Мы могли бы думать о них как о директивах Angular для бедняков. Каждый пользовательский элемент управления имеет свой контекст данных, определенный следующим образом:
DataContext="{Binding ViewModelName, Source={StaticResource Locator}}
Макет выглядит следующим образом: Макет Wpf Посмотрите на это, DG1 в VM1 является Master (клиент) и UC3 и UC4 - детали (заказы). Если я добавлю заказчику новый заказ, я бы хотел, чтобы он обновлялся в DG1 без обновления всей сетки.
В VM1 Data Grid 1 выбор изменен. Я запускаю команды для установки значений свойств зависимых пользовательских элементов управления.
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<mvvm:EventToCommand Command="{Binding ErrorWorkflow.GetErrorWorkflowCommand, Mode=OneWay, Source={StaticResource Locator}}" CommandParameter="{Binding SelectedError.WF_REF}" />
<mvvm:EventToCommand Command="{Binding ErrorDetails.GetErrorCaseDetailsCommand, Mode=OneWay, Source={StaticResource Locator}}" CommandParameter="{Binding SelectedError}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Эта часть работает нормально, но когда я изменяю значение в зависимой VM3 как для VM3, так и для VM1, значения свойств VM1 не меняются, даже если я вызываю RaisePropertyChanged или устанавливаю свойство явно вручную, например SelectedError.Status = «somethingnew».
С другой стороны, если я сниму выделение с сетки данных, зависимые модели представления останутся связанными (текстовые поля на них сохранят значение, потому что они ссылаются на свойства на своей собственной виртуальной машине3).
Все модели представления являются производными от ViewModelBase из mvvmLight и всех моделей из ObservableObjects (я знаю, что мне следует использовать Poco, но, видимо, мне также нужно создать каждое свойство на виртуальной машине). Пример:
public const string SelectedErrorPropertyName = "SelectedError";
private ErrorLog _selectedError;
public ErrorLog SelectedError
{
get
{
return _selectedError;
}
set
{
Set(() => SelectedError, ref _selectedError, value);
}
}
Я думаю, что Messenger был бы излишним, учитывая размер приложения (всего несколько страниц, подобных этой).
Должен ли я изменить страницу, чтобы использовать только одну модель представления и делиться ими для каждого пользовательского элемента управления, или мне здесь не хватает чего-то очевидного? Если вы считаете, что мне не хватает важной информации в этом примере, сообщите мне, и я обновлю.
Заранее благодарю за любой совет, ура!