У меня есть WPF-приложение с несколькими представлениями. Я хочу сменить вид 1 вид 2 и оттуда я могу переключиться на несколько видов. Поэтому я хочу, чтобы кнопки на просмотреть 1, который загружает представление2 в том же окне.
Я пробовал такие вещи, но может't получить его на работу.
С первым звеном, проблема в том, что я Дон'т понять код ViewModelLocator. Они называют `CreateMain (); функция, но где это определено, и как я могу переключиться на другой вид изнутри вид.
Во-первых, вы не'т необходимости любой из этих инструментов/механизмов для реализации в MVVM. Это может быть как простой, как это... позвольте'ы предположим, что мы имеем MainViewModel " и " PersonViewModel
и CompanyViewModel
, каждый со своими обзоры и расширение абстрактное
базовый класс BaseViewModel
.
В BaseViewModel, мы можем добавить общие свойства экземпляров и/или метода ICommand и осуществления INotifyPropertyChanged в интерфейс. Как они все продлить `BaseViewModel класса, мы можем иметь эту собственность в MainViewModel класса, который можно установить для любой из наших моделей вид:
public BaseViewModel ViewModel { get; set; }
Конечно, вы'd быть реализация INotifyPropertyChanged в
интерфейс правильно на ваш свойства, в отличие от этого небольшой пример. Теперь в приложение.в XAML` мы заявляем, какой простой шаблон данных DataTemplate для подключения вид с модели представления:
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:PersonViewModel}">
<Views:PersonView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:CompanyViewModel}">
<Views:CompanyView />
</DataTemplate>
Теперь, везде, где мы используем один из экземпляров нашей BaseViewModel в нашем приложении, эти шаблон данных DataTemplate будет рассказать рамками для отображения, а не в связанном виде. Мы можем показать их, как это:
<ContentControl Content="{Binding ViewModel}" />
Так что все, что нам нужно сделать сейчас, чтобы переключиться на новый вид-это установить свойство модель представления
в MainViewModel класса:
ViewModel = new PersonViewModel();
Наконец, как мы можем изменить взгляды, с другими взглядами? Ну есть несколько возможных способов сделать это, но самый простой способ это добавить привязки
от просмотра детьми непосредственно к метод ICommand
в MainViewModel
. Я использую пользовательскую версию RelayComand`, но вы можете использовать любой тип вы любите и я'м предполагаю, что вы'll получить картинку:
public ICommand DisplayPersonView
{
get { return new ActionCommand(action => ViewModel = new PersonViewModel(),
canExecute => !IsViewModelOfType<Person>()); }
}
В представлении ребенка в XAML:
<Button Command="{Binding DataContext.DisplayPersonView, RelativeSource=
{RelativeSource AncestorType={x:Type MainView}}, Mode=OneWay}" />
Что's это! Наслаждаться.
Когда я впервые начал с помощью MVVM я тоже боролся с различными шаблон MVVM-фреймворками и особенно навигационной частью. Поэтому я использую этот небольшой учебник я нашел, что Рэйчел Лим создал. Это's очень хорошо объяснил.
Посмотреть по следующей ссылке:
Надеюсь, что это помогло вам :)
Может быть, это Ссылка поможет вам. Просто установить свойство `NavigateTo на вид, который вы хотите отобразить на окне.
В качестве примера вы можете сделать что-то подобное
<Window x:Class="MainWindowView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:meffed="http:\\www.codeplex.com\MEFedMVVM"
meffed:ViewModelLocator.NonSharedViewModel="YourViewModel"
WindowStartupLocation="CenterScreen">
<Button meffed:NavigationExtensions.NavigateTo="firstview"
meffed:NavigationExtensions.NavigationHost="{Binding ElementName=_viewContainer}"
meffed:NavigationExtensions.NavigateOnceLoaded="False"
Visibility="Visible" />
<ContentControl x:Name="_viewContainer" Margin="0,0,0,10" />
<Window>
Затем файл класса будет
public partial class MainWindowView : Window
{
public MainWindowView()
{
InitializeComponent();
}
public ContentControl ViewContainer { get { return _viewContainer; } }
}
Затем вы можете определить каждый вид как элемент управления UserControl, а затем, используя ссылку я дал выше привязать кнопку'ы
meffed:NavigationExtensions.NavigateTo="в secondView"в. Чтобы пристрелть
класса ContentControlв
окнотолько использовать RelativeSource
обязательный. Для Эл.г
meffed:NavigationExtensions.NavigationHost=" и{привязки RelativeSource={RelativeSource режим=поиска, AncestorType={х:окно тип}},путь=ViewContainer}"
в
В каждом мнение, просто вижу, что вы комментировать код определения класса с [NavigationView (на"первый взгляд", У)]
и так далее.
Это сложно на первый раз, но это будет очень просто как только вы поймете идею.