C# 使用WPF和MVVM制作新游戏按钮
我正在用C#“玩”WPF和MVVM(目的:也许是为了让学生们作为WinForms的替代品来演示),为此我构建了一个简单的高低游戏(猜猜数字等等)。我对C#还比较陌生,并且已经学习了各种在线教程,有了一个有效的“游戏”除了在界面中启动新游戏的命令。我的难题解决方案是在代码中加入以下内容,这与再次调用MainWindow()基本相同: 但是我想通过在ViewModel中使用ICommand获得相同的效果 VM的构造函数是:C# 使用WPF和MVVM制作新游戏按钮,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在用C#“玩”WPF和MVVM(目的:也许是为了让学生们作为WinForms的替代品来演示),为此我构建了一个简单的高低游戏(猜猜数字等等)。我对C#还比较陌生,并且已经学习了各种在线教程,有了一个有效的“游戏”除了在界面中启动新游戏的命令。我的难题解决方案是在代码中加入以下内容,这与再次调用MainWindow()基本相同: 但是我想通过在ViewModel中使用ICommand获得相同的效果 VM的构造函数是: public HighLowGameViewModel()
public HighLowGameViewModel()
{
_game = new HighLowGameModel(1, 10);
MakeGuessCommand = new HighLowViewGameGuessCommand(this);
NewGameCommand = new HighLowViewGameNewGameCommand(this);
}
MakeGuessCommand实现了ICommand,工作正常,它位于自己的类中,因为我现在避免使用RelayCommand之类的东西。基于此,我为NewGameCommand创建了一个新类:
private HighLowGameViewModel _viewModel;
public HighLowViewGameNewGameCommand(HighLowGameViewModel viewModel)
{
_viewModel = viewModel;
}
#region ICommand Members
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return _viewModel.CanMakeNewGame;
}
public void Execute(object parameter)
{
_viewModel.NewGame();
}
和_viewModel.NewGame():
它在视图中单击按钮时运行此代码,该视图的命令设置为MakeNewCOmmand(Debug.Write输出到输出窗口,并在程序加载时逐步遍历HighLowGameModel的构造函数等),但视图中没有更新游戏的任何属性
我可能在我对设计模式的无知中遗漏了一些愚蠢的东西,但希望我已经包含了足够的细节,让其他人或许能告诉我哪里出了问题。。?如何刷新应用程序并将其返回到启动状态
以下是Clemens的评论(谢谢):添加
\u game
声明为HighLowViewModel
类中的属性,它保存游戏的数据(例如用户的猜测、计算机选择的随机值、剩余生命数等)。其中每一个都通过ViewModel中的该对象绑定到视图。似乎工作正常,值在绑定到窗口上的控件时得到更新和显示。但是,当调用命令创建新游戏时,该命令反过来调用模型的构造函数,为游戏设置新值(起始值):
public HighLowGameModel Game
{
get { return _game; }
set {
_game = value;
}
}
#region Constructor
public HighLowGameViewModel()
{
_game = new HighLowGameModel(1, 10);
MakeGuessCommand = new HighLowViewGameGuessCommand(this);
NewGameCommand = new HighLowViewGameNewGameCommand(this);
}
#endregion
但是,视图中的元素不会在游戏开始时使用新值进行更新。解决方案:
ViewModel类需要实现INotifyPropertyChanged以及模型(…我想我还需要进一步思考这个问题,即它是否应该只是实现该接口的ViewModel,但这似乎会导致重复…?)。无论如何,在该类中调用NewGame()时,它还需要指出OnPropertyChanged(“游戏”),正如下面的评论所指出的那样(再次感谢)。不清楚HighLowGameViewModel中的
\u Game
成员到底是什么,以及视图如何链接到它。但是,它应该是带有更改通知的公共属性,以更新UI。更改通知意味着所属类实现INotifyPropertyChanged接口,属性的设置程序触发该接口的PropertyChanged事件。有关参考信息,请参阅和。
public void NewGame()
{
int currentMax = _game.Max;
Debug.Write("I am trying to make new game");
_game = new HighLowGameModel(1, currentMax);
}
public HighLowGameModel Game
{
get { return _game; }
set {
_game = value;
}
}
#region Constructor
public HighLowGameViewModel()
{
_game = new HighLowGameModel(1, 10);
MakeGuessCommand = new HighLowViewGameGuessCommand(this);
NewGameCommand = new HighLowViewGameNewGameCommand(this);
}
#endregion