Пользовательский контроль WPF mvvm

У меня проблема с реализацией MVVM с помощью usercontrols.

У меня есть приложение на основе MVVM.

В одном из представлений (которое является пользовательским элементом управления) у меня есть меню слева и содержимое справа. Содержание меняется в зависимости от меню. Я пытался реализовать MVVM с помощью пользовательского элемента управления, но не знаю, как это сделать.

Вот что я пробовал, но это не сработало:

<UserControl x:Class = "PoS.Views.OptionsView"
    xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local = "clr-namespace:PoS.Views"
    mc:Ignorable = "d" 
    d:DesignHeight = "450" d:DesignWidth = "800">

    <UserControl.Resources>
        <DataTemplate x:Name = "SettingsTemplate" DataType = "{x:Type viewmodels:SettingsViewModel}">
            <views:SettingsView DataContext = "{Binding}" />
        </DataTemplate>
    </UserControl.Resources>
    <Grid>

    </Grid>
</UserControl>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
64
1

Ответы 1

Честно говоря, я думаю, вам нужно немного отмотать назад и прочитать хорошую книгу о MVVM, прежде чем продолжить. Pro WPF and Silverlight MVVM Гэри Маклина Холла — хорошее место для начала.

Чтобы ответить на ваш вопрос, я предполагаю, что этот пользовательский элемент управления настроен так, что его DataContext указывает на ваш MainViewModel. Содержимому справа требуется соответствующее свойство в модели основного представления, например, что-то вроде этого:

private ViewModelBase _CurrentPage;
public ViewModelBase CurrentPage
{
    get { return this._CurrentPage; }
    set
    {
        if (this._CurrentPage != value)
        {
            this._CurrentPage = value;
            RaisePropertyChanged(() => this.CurrentPage);
        }
    }
}

Затем вы создаете кучу «страниц» или что-то, что наследует ViewModelBase, то есть Page1ViewModel, Page2ViewModel, SettingsViewModel и т. д. Затем вы создаете ContentControl и привязываете его содержимое к этому свойству:

<ContentControl Content = "{Binding CurrentPage}" />

Итак, теперь, если ваша модель представления делает что-то вроде CurrentPage = new SettingsViewModel(), тогда ContentControl будет заполнена тем, что вы объявили как DataTemplate для этого типа (т.е. элементом управления типа views:SettingsView). Если вы присвоите свойство чему-то другому, то SettingsView будет уничтожен и заменен любым DataTemplate для нового типа.

В приведенном выше примере будут работать только SettingsViewModel/SettingsView, потому что это все, для чего вы создали DataTemplate; чтобы это работало, вам нужно создать отдельный DataTemplate для каждого типа пары ViewModel/View, которую вы создаете.

Меня интересует рекомендованная вами книга «Pro WPF и Silverlight MVVM», но отзывы о ней на Amazon невелики. Если вы не возражаете, я хотел бы знать, почему вы считаете, что это хорошая книга.

redcurry 18.03.2019 01:02

Честно? Потому что это тот, у которого я изначально учился, и я нашел его очень поучительным в то время. Конечно, это было где-то 7 или 8 лет назад, о чем свидетельствует тот факт, что в его названии есть «Silverlight», так что, возможно, сейчас есть много гораздо лучших вариантов. Я также обнаружил, что «Advanced MVVM» Джоша Смита стоит прочитать и содержит несколько хороших практических советов, хотя и немного кратких.

Mark Feldman 18.03.2019 07:06

Другие вопросы по теме