当我的Model和ViewModel完全相同时,我会为MVVM烦恼吗?WP 8.1

本文关键字:烦恼 MVVM WP ViewModel Model 我的 | 更新日期: 2023-09-27 18:00:34

我正在开发Windows Phone 8.1(非SL)应用程序。这是一个针对儿童的关于水果和蔬菜的智力竞赛游戏。这是我的整个模型:

namespace FruityLogic.Models
{
    public class Quiz
    {
        public int lives { get; set; }
        public Question Question { get; set; }
        public List<Feg> Feges { get; set; } // Feg meaning Fruit and Veg ;)
        public List<int> IdsOfDoneFeges { get; set; }
        public Quiz()
        {
            LoadData();
            lives = 3;
            IdsOfDoneFeges = new List<int>();
            Question = new Question()
            {
                Feg = Feges[0],
                OptionFeges = new List<Feg>()
                {
                    Feges[1],
                    Feges[2],
                    Feges[0]
                }
            };
        }
        public void LoadData()
        {
            Feges = new List<Feg>()
            {
                new Feg() { Id = 0, Name = "Banana", Image = "../assets/banana.jpg"},
                new Feg() { Id = 1, Name = "Orange", Image = "../assets/orange.jpg"},
                new Feg() { Id = 2, Name = "Apple", Image = "../assets/apple.jpg"},
                new Feg() { Id = 3, Name = "Cherry", Image = "../assets/cherry.jpg"},
                new Feg() { Id = 4, Name = "watermelon", Image = "../assets/watermelon.jpg"},
                new Feg() { Id = 5, Name = "Lettuce", Image = "../assets/lettuce.jpg"},
            };
        }
    }
}

测试应该在屏幕上显示水果或蔬菜的图片,用户可以为显示的水果/蔬菜选择正确的名称。

我在MVVM方面很吃力。我读过这个教程,但它并不真正适用于我,或者至少我无法将其联系起来!

据我所见,我的模型和ViewModel完全相同。我是否需要创建ViewModel?

此外,我如何告知我的观点,一个问题已经改变,从而与下一个问题绑定?我是否在Question类上实现了INotifyPropertyChanged,并为Question的每个属性激发它?还是仅仅一处房产就足够了?此外,如果我这样做,在我的Quiz类中,问题周围没有ObservableObject<>,测验如何知道问题已经改变?

正如你所知,我对这一切感到困惑,非常感谢你的澄清。

当我的Model和ViewModel完全相同时,我会为MVVM烦恼吗?WP 8.1

据我所见,我的模型和ViewModel完全相同。我是否需要创建ViewModel?

是的。您需要一个ViewModel来将视图数据绑定到。问题是您是否需要一个单独的Model。这取决于你对它做了什么,比如存储在Db或文件中。但单独的模型通常是个好主意。

并且您的Model属性都没有实现INotifyPropertyChanged,这是需要解决的问题,例如通过在具有INPC的VM中复制它们。

此外,我如何告知我的观点,一个问题已经改变,从而与下一个问题绑定?

通过添加SelectedQuestion属性。这是VM的任务"选定"对于模型来说通常不是一个有意义的概念。

总之,ViewModel应执行"Presentation Logic",Model应为"Bussines Logic"。

ViewModel可以非常简单,将整个Model类作为单个属性转发。然后添加SelectedSomething等

我一直很喜欢这张照片,但其他人觉得它太复杂了。