WPF MVVM Перемещение между представлениями по нажатию кнопки - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь создать приложение WPF и для навигации я использую пример, который я нашел в

https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/

Теперь мне нужно перейти от одного UserControl к другому на кнопкенажмите кнопку.

Может кто-нибудь подсказать мне, как этого добиться с помощью MVVM?Или, если мне следует взглянуть на использование какой-то основы для навигации.

1 Ответ

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

Это будет зависеть в некоторой степени от контекста, но часто я использую технику, в которой у меня есть объект (или какой-то абстрактный класс) с именем типа «MainContent» внутри некоторой ViewModel.Это ответственно за удержание контента для отображения в ContentControl.

Мой XAML будет выглядеть примерно так, где Type1View и Type2View будут UserControl s (vw_Type1 и vw_Type2 являются ссылками на их пространства имен), и затем я бы переключался между ними, устанавливая MainContent для экземпляра Type1ViewModel или Type2ViewModel.

<ContentControl Content="{Binding MainContent}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type vm_Type1:Type1ViewModel}">
            <vw_Type1:Type1View />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm_Type2:Type2ViewModel}">
            <vw_Type2:Type2View />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>

Об этом можно было бы позаботиться, возможно, скнопка (или две кнопки в следующем примере) вне ContentControl, которая отправляет команду ViewModel, содержащую MainContent, которая просто изменяет свойство MainContent, либо на существующий, либо на новый экземпляр Type1ViewModelили Type2ViewModel.Например:

private Type1ViewModel _type1ViewModel;
public Type1ViewModel Type1ViewModel
{
    get { return _type1ViewModel; }
    set
    {
        if (_type1ViewModel != value)
        {
            _type1ViewModel = value;
            NotifyPropertyChanged();
        }
    }
}

private Type2ViewModel _type2ViewModel;
public Type2ViewModel Type2ViewModel
{
    get { return _type2ViewModel; }
    set
    {
        if (_type2ViewModel != value)
        {
            _type2ViewModel = value;
            NotifyPropertyChanged();
        }
    }
}

...

private ObservableObject _mainContent;
public ObservableObject MainContent
{
    get { return _mainContent; }
    set
    {
        if (_mainContent != value)
        {
            _mainContent = value;
            NotifyPropertyChanged();
        }
    }
}

...

public InternalDelegateCommand NavigateToType1Command => new InternalDelegateCommand(NavigateToType1);
public InternalDelegateCommand NavigateToType2Command => new InternalDelegateCommand(NavigateToType2);

...

private void NavigateToType1() => MainContent = Type1ViewModel;
private void NavigateToType2() => MainContent = Type2ViewModel;

Итак, чтобы завершить XAML для этого примера:

<Button Content="Type 1" Command="{Binding NavigateToType1Command}" />
<Button Content="Type 2" Command="{Binding NavigateToType2Command}" />
<ContentControl Content="{Binding MainContent}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type vm_Type1:Type1ViewModel}">
            <vw_Type1:Type1View />
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm_Type2:Type2ViewModel}">
            <vw_Type2:Type2View />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>

(Информацию по InternalDelegateCommand см. В моем ответе на этот вопрос .)

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