使用MVVM将字段从一个页面传递到WPF中的另一个页面

时间:2017-11-03 08:12:02

标签: c# .net wpf mvvm navigationservice

我们正在制作一个项目,我们有一个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的方法,因此我们可以使用某种委托。

我希望问题不是混淆。

1 个答案:

答案 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 ...)但你可以做更复杂的事情

相关问题