我们正在制作一个项目,我们有一个WPF应用程序页面,它将选择三个保存游戏,然后导航到下一页。我们想知道如何传递我们从第一页加载到第二页的GameInstance。
我们已经在Code Behind中实现了这一点,但我们不喜欢在代码中使用逻辑,因为我们正在使用MVVM架构。
保存窗口后面的代码
public SaveGameWindow()
{
InitializeComponent();
}
private void LoadGame1_Click(object sender, RoutedEventArgs e)
{
var comb = new SaveGameViewModel();
comb.LoadGame1();
this.NavigationService.Navigate(comb.TempCombatWindow);
}
private void LoadGame2_Click(object sender, RoutedEventArgs e)
{
var comb = new SaveGameViewModel();
comb.LoadGame2();
this.NavigationService.Navigate(comb.TempCombatWindow);
}
private void LoadGame3_Click(object sender, RoutedEventArgs e)
{
var comb = new SaveGameViewModel();
comb.LoadGame3();
this.NavigationService.Navigate(comb.TempCombatWindow);
}
我们想知道的是,如何实现与上面相同的内容,但是在我们的ViewModel中用于保存游戏。
问题是当我们更改页面时,我们使用NavigationService,但这在ViewModel中不可用,我们还没有找到将此属性绑定到所述ViewModel的方法,因此我们可以使用某种委托。
我希望问题不是混淆。
答案 0 :(得分:0)
您可以在视图模型中使用ICommand和命令参数并使用事件来执行此操作。 您可以为命令实现接口like this one。
在View Model中实现界面并创建如下函数:
private void LoadGame(object parameter)
{
switch (parameter.ToString())
{
case "1":
LoadGame1();
break;
case "2":
LoadGame2();
break;
case "3":
LoadGame3();
break;
}
ComabtWindowHandler();
}
处理程序将是您将在代码后面实现的事件处理程序。但首先你需要像这样的ICommand:
public ICommand Load
{
get
{
RelayCommand<object> load= new RelayCommand<object((parameter) => LoadGame(parameter));
return load;
}
}
此属性将在您的xaml中绑定在Save按钮的Command属性中。
对于处理程序,首先在View模型中声明一个抽象事件处理程序
public EventHandler ComabtWindowHandler;
在主窗口中,当您加载View模型时,只需添加将处理事件的delagate,因此添加这段代码(假设comb是您的viewmodel的实例):
comb.ComabtWindowHandler += delegate
{
this.NavigationService.Navigate(comb.TempCombatWindow);
};
最后在xaml中,在你的3个按钮中绑定Command并定义CommandParameter属性(在我的例子中,命令参数只是“1”或“2”或“3”。当然按钮1将有参数=“1”ecc ...)但你可以做更复杂的事情