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

Pass Field from one page to another page in WPF using MVVM

我们正在制作一个项目,其中有一个 WPF 应用程序页面,它将从三个游戏中选择一个保存游戏,然后导航到下一页。我们想知道如何将我们从第一页加载的 GameInstance 传递到第二页。

我们已经在代码隐藏中实现了这一点,但我们不喜欢代码隐藏的逻辑,因为我们使用的是 MVVM 架构。

保存后的代码window

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 的方法,因此我们可以使用一些有点像代表。

我希望这个问题不会令人困惑。

您可以在视图模型中使用 ICommand 和命令参数并使用事件来执行此操作。 您可以为您的命令实现接口 like this one

  • 在您的视图模型中实现接口并创建如下函数:

    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 中,在您的保存按钮的命令 属性 中。

  • 对于处理程序,首先在您的视图模型中声明一个抽象事件处理程序

    public EventHandler ComabtWindowHandler;

  • 在您的 Main Window 中,当您加载 View 模型时,只需添加将处理事件的委托,因此添加这段代码(假设 comb 是你的视图模型):

    comb.ComabtWindowHandler += delegate { this.NavigationService.Navigate(comb.TempCombatWindow); };

  • 最后在xaml中,在你的3个按钮中绑定Command并定义CommandParameter属性(在我的例子中,命令参数只是“1”或“2”或“3” "。当然按钮 1 会有参数 = "1" ecc...) 但你可以做更复杂的事情