WPF调用方法与属性

时间:2015-03-23 09:29:36

标签: c# wpf mvvm

我对WPF不太熟练。我想要做的是从我的视图绑定到属性,然后用某些东西设置该值。我已经没有遇到麻烦,但我觉得我没有正确使用MVVM模式。我在ViewModel中拥有我的属性,绑定到View但是我似乎无法使Model部分工作,因为我打算将属性从其获取其值的方法当前也在ViewModel中。

以下是我目前的情况:

public class MainViewModel : ViewModelBase
{
    private Awesome _model; //this is my model
    private string _score;

    public string Score
    {
        get { return GetScore(); }
        set
        {
            _score = value;
        }
    }

    public string GetScore()
    {
        try
        {
            using (StreamReader sr = new StreamReader(@"C:\somepath"))
            {
                String line = sr.ReadToEnd();
                return line;
            }
        }
        catch (Exception)
        {
            MessageBox.Show("File could not be found! :(");
            throw;
        }
    }
}

这很好用,但现在一切都在ViewModel中。据我所知,GetScore()应该在Model中,但是我不知道如何用它来设置属性。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

GetScore() - 方法不应该在模型中。模型是数据层,因此只有具有属性的数据对象。方法和其他东西由ViewModel协调。因此,您可以在ViewModel中放置GetScore-Method或将其移至另一个类并从ViewModel调用它。

顺便说一下:你的财产有点奇怪。因为在你的二传手中你设置了一个永远不会再使用的后端字段。你确定这是你想要的吗?您也不应该总是在getter中读取文件。

也许你想做类似的事情:

public string Score
{
    get { return _score ?? (_score = GetScore()); }
}

因此,您只需阅读一次文件,并将值保存在_score中。

答案 1 :(得分:1)

您的GetScore()属于ViewModel,因为它是数据层。 (当然你可以把它移到另一个班级,但它不是我在ViewModel中的POV的wrog,把它视为一个扩展的getter;)

但是

  1. 您应该将GetScore设为私有,因为您有一个属性
  2. 您不应该从ViewModel影响UI,所以我愿意 建议您不要从ViewModel打开MessageBox。
  3. 使用return this.GetScore()