WPF usercontrol mvvm - PullRequest
       1

WPF usercontrol mvvm

0 голосов
/ 17 марта 2019

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

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

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

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

<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>

1 Ответ

0 голосов
/ 17 марта 2019

Я буду честен, я думаю, вам нужно немного перемотать и прочитать хорошую книгу о 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...