2017-01-11 5 views
0

Я делаю ViewModel в первый раз, после некоторых исследований я получил следующий код:Создание ошибка ViewModel

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace HotelWPF 
{ 
    public class ReservationVM : INotifyPropertyChanged 
    { 
     public Reservation reservation = new Reservation(); 
     private string SecretaryName; 
     private int RoomNumber; 
     private string ReservationType; 
     private DateTime ReservationDate; 

     public string SecretaryName1 
     { 
      get 
      { 
       return SecretaryName; 
      } 

      set 
      { 
       SetProperty(ref SecretaryName, value); 
      } 
     } 

     public int RoomNumber1 
     { 
      get 
      { 
       return RoomNumber; 
      } 

      set 
      { 
       SetProperty(ref RoomNumber, value); 
      } 
     } 

     public string ReservationType1 
     { 
      get 
      { 
       return ReservationType; 
      } 

      set 
      { 
       SetProperty(ref ReservationType, value); 
      } 
     } 

     public DateTime ReservationDate1 
     { 
      get 
      { 
       return ReservationDate; 
      } 

      set 
      { 
       SetProperty(ref ReservationDate, value); 
      } 
     } 
     public void SetProperty<T>(ref T store, T value, [CallerMemberName] string name = null) 
     { 
      store = value; 
      if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedArgs(name)); 

     } 
    } 
} 

я получаю следующее сообщение об ошибке:

PropertyChanged doesn't exist in current context. 

также CallerMemberName дает me the error:

Type or namespace couldn't be found 

Это очень трудно сделать моделью в качестве ученика первого курса, помощь будет ppreciated

Edit: Это одна из моих классов моделей:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace HotelWPF 
{ 
    public class Reservation 
    { 
     private string SecretaryName; 
     private int RoomNumber; 
     private string ReservationType; 
     private DateTime ReservationDate; 

     public string SecretaryName1 
     { 
      get 
      { 
       return SecretaryName; 
      } 

      set 
      { 
       SecretaryName = value; 
      } 
     } 

     public int RoomNumber1 
     { 
      get 
      { 
       return RoomNumber; 
      } 

      set 
      { 
       RoomNumber = value; 
      } 
     } 

     public string ReservationType1 
     { 
      get 
      { 
       return ReservationType; 
      } 

      set 
      { 
       ReservationType = value; 
      } 
     } 

     public DateTime ReservationDate1 
     { 
      get 
      { 
       return ReservationDate; 
      } 

      set 
      { 
       ReservationDate = value; 
      } 
     } 
    } 
} 

ответ

3

Вы на самом деле не осуществлять INotifyPropertyChanged; Вы только обещали компилятор, что вы в объявлении класса, здесь:

ReservationVM : INotifyPropertyChanged 

И теперь он держит вас это обещание. Чтобы реализовать этот конкретный интерфейс, вам просто нужно реализовать событие PropertyChanged в вашем классе viewmodel, ReservationVM. Это легко, просто добавьте эту строку, которая ее определяет:

public event PropertyChangedEventHandler PropertyChanged; 

Visual Studio также будет реализовывать интерфейсы для вас. Щелкните правой кнопкой мыши имя интерфейса в объявлении класса вверху и выберите «Внедрить интерфейс» из контекстного меню (в зависимости от версии VS, которая может быть в разделе «Быстрые действия и рефакторинг»). Вы не хотите реализовывать «явно», просто регулярное «внедрение».

Как только вы там, вам нужно пространство имен для CallerMemberNameAttribute. Это быстрый один тоже:

Добавьте эту строку:

using System.Runtime.CompilerServices; 

... в верхней части файла.

Еще один момент, который я хотел бы сделать, - это присвоение имен вашей недвижимости. Это ничего не сломает, но общепринятое общепринятое соглашение об именах - это не очень хорошая идея. Это тем более обычная условность:

private string _secretaryName; 
    public string SecretaryName 
    { 
     get 
     { 
      return _secretaryName; 
     } 

     set 
     { 
      SetProperty(ref _secretaryName, value); 
     } 
    } 
+0

к модели или модели? – Gigitex

+0

@Gigitex Viewmodel. Тот, который говорит, что он внедряет INotifyPropertyChanged –

+0

Все еще получая ошибку – Gigitex

2

PropertyChanged это событие, которое требуется, чтобы быть определена INotifyPropertyChanged. Лучше всего использовать способ «Использовать интерфейс», поместив курсор ввода на INotifyPropertyChanged в свой код и нажав Ctrl+.. Вы также можете навести на него курсор мышью, а затем щелкнуть по появившейся лампочке.

Или просто добавьте следующую строку в модели представления:

public event PropertyChangedEventHandler PropertyChanged; 

другая Ваша ошибка в том, что вы не добавили имен для CallerMemberName. Вы можете получить его из «использования» так же, как указано выше, или добавить следующую строку в начало вашего файла модели просмотра:

using System.Runtime.CompilerServices; 

 Смежные вопросы

  • Нет связанных вопросов^_^