Обмен данными WPF MvvM между моделями представления в одном представлении

Этот заголовок может не подходить для самого вопроса, но оставайтесь со мной  Я изменю его, если у вас есть предложение получше. Это мое первое приложение 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 был бы излишним, учитывая размер приложения (всего несколько страниц, подобных этой).

Должен ли я изменить страницу, чтобы использовать только одну модель представления и делиться ими для каждого пользовательского элемента управления, или мне здесь не хватает чего-то очевидного? Если вы считаете, что мне не хватает важной информации в этом примере, сообщите мне, и я обновлю.

Заранее благодарю за любой совет, ура!


person jabree    schedule 18.08.2014    source источник
comment
Задайте 1 вопрос на вопрос.   -  person Henk Holterman    schedule 18.08.2014
comment
Хенк, спасибо, что проявили интерес. В последнем абзаце есть один вопрос. С Уважением   -  person jabree    schedule 18.08.2014
comment
В вашем заголовке еще 2.   -  person Henk Holterman    schedule 18.08.2014
comment
Вы меня убиваете :) поэтому я оставил там первую строчку.   -  person jabree    schedule 19.08.2014


Ответы (1)


Вы никогда не должны изменять страницу только на одну модель просмотра, и Messenger не является излишним. MVVM Light Messenger создан для точного решения проблемы (связи между виртуальными машинами), с которой вы столкнулись в данный момент. Вы должны это использовать.

Для получения дополнительной информации о передаче сообщений в MVVM Light Джесси Либерти из Microsoft имеет отличный учебник о том, как его использовать.

person David Leitner    schedule 19.08.2014