编辑:示例应用程序-> 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
}
}