使用 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...) 但你可以做更复杂的事情
我们正在制作一个项目,其中有一个 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...) 但你可以做更复杂的事情