C# 使用WPF和MVVM制作新游戏按钮

C# 使用WPF和MVVM制作新游戏按钮,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在用C#“玩”WPF和MVVM(目的:也许是为了让学生们作为WinForms的替代品来演示),为此我构建了一个简单的高低游戏(猜猜数字等等)。我对C#还比较陌生,并且已经学习了各种在线教程,有了一个有效的“游戏”除了在界面中启动新游戏的命令。我的难题解决方案是在代码中加入以下内容,这与再次调用MainWindow()基本相同: 但是我想通过在ViewModel中使用ICommand获得相同的效果 VM的构造函数是: public HighLowGameViewModel()

我正在用C#“玩”WPF和MVVM(目的:也许是为了让学生们作为WinForms的替代品来演示),为此我构建了一个简单的高低游戏(猜猜数字等等)。我对C#还比较陌生,并且已经学习了各种在线教程,有了一个有效的“游戏”除了在界面中启动新游戏的命令。我的难题解决方案是在代码中加入以下内容,这与再次调用MainWindow()基本相同:

但是我想通过在ViewModel中使用ICommand获得相同的效果

VM的构造函数是:

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