2015-03-23 4 views
0

Я не очень хорошо разбираюсь в WPF. То, что я хочу сделать, это привязать свойство к моему представлению и затем установить это значение с чем-то. У меня эта работа работает без проблем, но у меня есть ощущение, что я не правильно использую шаблон MVVM здесь. У меня есть свойство в ViewModel, связанное с представлением, но я не могу заставить часть модели работать так, как я предполагаю, поскольку метод, в котором свойство получает свое значение, в настоящее время также находится в ViewModel.Метод вызова WPF с свойством

Вот что я в настоящее время:

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() должен быть в Модели, но тогда я не уверен, как установить свойство с ним. Что мне здесь не хватает?

+0

Вы можете поместить '' Score' и GetScore() 'в вашей модели, и только выставить свойство вашей модели в ViewModel, то на ваш взгляд, вы можете привязать к' ModelProperty. Score'. – Bolu

ответ

2

GetScore() -Метод не должен быть в модели. Модель представляет собой слой данных, поэтому есть только объекты данных с такими свойствами. Методы и другие материалы координируются ViewModel. Таким образом, вы можете позволить вашему методу GetScore в вашем ViewModel или перенести его в другой класс и вызвать его из ViewModel.

Кстати: Ваша собственность немного странная. потому что в вашем сеттере вы устанавливаете бэкэнд-поле, которое больше никогда не будет использоваться. Вы уверены, что это то, что вы хотите? Вы также не должны всегда читать файл в получателе.

Может быть, вы хотите сделать что-то вроде:

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

Таким образом, вы только прочитать файл один раз и сохранить значение, сохраненное в _SCORE.

1

Ваш GetScore() принадлежит ViewModel, так как это слой данных. (Конечно, вы можете переместить его в другой класс, но это не wrog от моего POV в ViewModel, увидеть его в качестве расширенного добытчика;))

Но

  1. Вы должны GetScore частный, потому что вы имеют свойство для него
  2. Вы не должны влиять на пользовательский интерфейс из ViewModel, поэтому я бы советовал вам не открывать MessageBox из ViewModel.
  3. Использование return this.GetScore()
+0

Какое преимущество имеет использование 'return this.GetScore()' вместо 'return GetScore()'? – Tomtom

+0

Это действительно вопрос личного вкуса, потому что это ключевое слово удаляется компилятором. С моей точки зрения, это имеет следующие преимущества: 1) Ясно, что свойство/Variable/whatever принадлежит экземпляру и не является локальным полем или чем-то еще. Я все так выразился так: «Развертывание этого авангарда всего достигло своей цели, когда оно ничего не изменило: оно помогает предотвратить неоднозначность. (например, с помощью переменной метода и переменной экземпляра). Когда вы все это используете, у вас никогда не будет этой проблемы. НО ЭТО ТОЛЬКО ЛИЧНЫЙ ВКУС – Christian

+0

FWIW: ViewModel не является слоем данных. ViewModel - это уровень представления. MVVM не определяет, как и ** где ** определять вашу «инфраструктуру» или «уровень данных». ViewModel предназначен исключительно для логики представления. Ваша бизнес-логика касается либо ваших моделей, либо доменных/бизнес-сервисов (богатая модель домена), либо только для доменных/бизнес-услуг (модель анемичного домена). Инфраструктура (то есть уровень доступа к данным) представляет собой совершенно другую абстракцию (то есть через репозиторий или шаблон cqrs) – Tseng