0

编辑:示例应用程序-> http://www10.zippyshare.com/v/29730402/file.html

我正在为 Windows 8 和 Windows Phone 编写应用程序。我正在使用可移植类库(请参阅这篇文章http://blog.tattoocoder.com/2013/01/portable-mvvm-light-move-your-view.html)。

我的问题是:如何通过使用 MVVM 模式单击按钮来打开第二个窗口?我不想在后面的代码中这样做。

我的 Windows 8 应用程序的数据上下文在 xaml 中看起来像这样

DataContext="{Binding Main, Source={StaticResource Locator}}"

它使用 PCL 的 ViewModel(= W8 和 WP8 的 ViewModel)

xmlns:vm="using:Mvvm.PCL.ViewModel" 

我不知道如何将 2 datacontext 分配给我的 MainPage.xaml,也不知道如何将 MainPage.xaml 分配给我的 Windows 8 应用程序的 ViewModel。

我试过这样的事情:

Command="{Binding DisplayView}" CommandParameter="SecondView"

但是该程序在两个平台上都使用了 ViewModel,我不能在那里为特定平台编写 windows-assignment。(它应该看起来像这样通过使用 MVVM silverlight 方法单击按钮打开多个视图...)

说清楚:

我有2个项目。项目的两个 MainWindow 都引用了“MainProject”的 ViewModel。如果我想在我的 MainWindow 中单击一个按钮,我想打开一个新视图,但我只能将 ViewModel 用于两个项目,这意味着我不能在我的 ViewModel 中使用这两个项目的任何视图“主项目”。

编辑:我看到很多人使用 ContentControl。(仍然不起作用。顺便说一句,我是 MVVM 的新手)。

<ContentControl Grid.Row="2" Content="{Binding CurrentView}" IsTabStop="False" Margin="10" />
<Button Command="{Binding DisplayView}" CommandParameter="SecondView">

MainViewModel.cs(适用于两个平台)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using Mvvm.PCL.Model;
#if NETFX_CORE 
    using Mvvm.Store.Views;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
#endif

namespace Mvvm.PCL.ViewModel
{

public class MainViewModel : ViewModelBase, INotifyPropertyChanged
{
    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>

    public MainViewModel()
    {
#if NETFX_CORE
        DisplayView = new RelayCommand<string>(DisplayViewCommandExecute);
#endif
        }

    #region Commands

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

    #endregion

#if NETFX_CORE

    #region CurrentView Property

    public const string CurrentViewPropertyName = "CurrentView";

    private Page _currentView;

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

            _currentView = value;
            RaisePropertyChanged(CurrentViewPropertyName);
        }
    }

    private SecondView _secondview = new SecondView();
    public SecondView SecondView
    {
        get
        {
            return _secondview;
        }
    }

    #endregion

    private void DisplayViewCommandExecute(string viewName)
    {
        switch (viewName)
        {
            case "SecondView":
                CurrentView = _secondview;
                var frame = (Frame)Window.Current.Content;
                frame.Navigate(typeof(SecondView));
                break;
        }
    }
#endif
}
}
4

0 回答 0