Открытие нескольких представлений путем нажимания кнопки с помощью MVVM подход Silverlight

Я хочу использовать подход MVVM для достижения чего-то как ниже:

У меня есть MainWindow, где у меня есть 3 Кнопки как: Клиенты a) b) Заказы c) Продажи

Путем нажатия на кнопку это должно открыть свой соответствующий window/usercontrol xaml с клиентскими деталями, подробными сведениями о заказах, деталями продаж.

Я попробовал все, но culdnt способный сделать так.

Как достигнуть этого использования шаблон MVVM. Любезно предоставьте решение?

Спасибо

1
задан Tarun 23 June 2010 в 09:36
поделиться

2 ответа

Ответ зависит от того, как вы хотите отобразить представления Customers, Orders и Sales. Если вы хотите, чтобы они отображались в одном представлении, просто добавьте элемент управления содержимым, привязанный к свойству в вашей основной ViewModel.

Например, если вы используете MVVM Light Toolkit, ваш MainPage.xaml может выглядеть следующим образом...

<UserControl x:Class="MvvmLight2.MainPage"
             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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             Height="300"
             Width="300"
             DataContext="{Binding Main, Source={StaticResource Locator}}">

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

    <StackPanel Orientation="Vertical">

        <StackPanel Orientation="Horizontal">
            <Button Content="Customers" Command="{Binding DisplayView}" CommandParameter="Customers" Margin="10" />
            <Button Content="Orders" Command="{Binding DisplayView}" CommandParameter="Orders" Margin="10" />
            <Button Content="Sales" Command="{Binding DisplayView}" CommandParameter="Sales" Margin="10" />
        </StackPanel>

        <ContentControl Content="{Binding CurrentView}" IsTabStop="False" Margin="10" />

    </StackPanel>
</UserControl>

А ваша модель MainPageViewModel будет...

using System.Windows.Controls;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;

namespace MvvmLight2.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        public MainViewModel()
        {
            DisplayView = new RelayCommand<string>(DisplayViewCommandExecute);
        }

        #region Commands

        public RelayCommand<string> DisplayView { get; private set; }

        #endregion

        #region CurrentView Property

        public const string CurrentViewPropertyName = "CurrentView";

        private UserControl _currentView;

        public UserControl CurrentView
        {
            get { return _currentView; }
            set
            {
                if (_currentView == value)
                    return;

                _currentView = value;
                RaisePropertyChanged(CurrentViewPropertyName);
            }
        }

        #endregion

        private void DisplayViewCommandExecute(string viewName)
        {
            switch (viewName)
            {
                case "Customers":
                    CurrentView = new CustomersView();
                    break;
                case "Orders":
                    CurrentView = new OrdersView();
                    break;
                case "Sales":
                    CurrentView = new SalesView();
                    break;
            }
        }
    }
}

Все это предполагает, что вы создали представления и модели представлений для клиентов, заказов и продаж и изменили ViewModelLocator, чтобы включить их.

На данном этапе, если вам нужно отобразить определенную информацию в дочерних представлениях, вы можете создать зависимое свойство в них и установить его из вашей MainViewModel перед отображением представления.

2
ответ дан 2 September 2019 в 23:36
поделиться

Возможно, вы захотите рассмотреть шаблон посредника . Общими реализациями являются класс Messenger в MVVM Light Toolkit и Event Aggregation в PRISM.

Один базовый рабочий процесс с использованием этого паттерна... Вызывается команда на viewmodel1. Viewmodel1 регистрирует некоторое сообщение у посредника. Viewmodel2 подписывается на это сообщение и делает что-то в ответ (например, создает новый view2 или изменяет визуальное состояние view2).

0
ответ дан 2 September 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: