2013-05-31 2 views
2

Вот как я реализую INotifyPropertyChanged вINotifyPropertyChanged при экспонировании сырьевой модели вместо индивидуальных свойств

момент-
public class ViewModel : INotifyPropertyChanged 
{ 
    public Person Person1 { get; set; } 
    public Person Person2 { get; set; } 

    public string Person1Name 
    { 
     get { return Person1.Name; } 
     set 
     { 
      Person1.Name = value; 
      RaisePropertyChangedEvent("Person1Name"); 
     } 
    } 

    public string Person2Name 
    { 
     get { return Person2.Name; } 
     set 
     { 
      Person2.Name=value; 
      RaisePropertyChangedEvent("Person2Name"); 
     } 
    } 
} 

//This is the Model 
public class Person 
{ 
    private string _name; 
    public string Name { get; set; } 
} 

И XAML Я использую для этого типа реализации -

<Label Text="{Binding Path=Person1Name}"/> 
<Label Text="{Binding Path=Person2Name}"/> 

То, что я хочу сделать, - это IRaisePropertyChangedEvent, когда какое-либо свойство в модели изменяется, но я не хочу явно раскрывать свойство, как я там делаю. Я просто хочу разоблачить всю модель, и всякий раз, когда свойство внутри модели изменяется, оно должно возбуждать событие уведомления. Но я не хочу, чтобы модель реализовала INotifyPropertyChanged, я хочу, чтобы ViewModel реализовал ее. Поэтому в основном то, что я ищу что-то вроде этого -

public class ViewModel : INotifyPropertyChanged 
{ 
    public Person Person1 
    { 
     get { return _person1; } 
     set 
     { 
      _person1 = value; 
      RaisePropertyChangedEvent("Person1"); 
      //So, whenever a property within my Person1 changes, raise event for that property. 
     } 
    } 
    public Person Person2 
    { 
     get { return _person2; } 
     set 
     { 
      _person2 = value; 
      RaisePropertyChangedEvent("Person2"); 
     } 
    } 
} 

XAML:

<Label Text="{Binding Path=Person1.Name}"/> 
<Label Text="{Binding Path=Person2.Name}"/> 

Как мне это сделать? Если думаю, вопрос непонятен, прокомментируйте, и я постараюсь лучше.

+0

Вот почему я не люблю эту конструкцию. Хотя сначала это кажется быстрым способом создания модели просмотра, в конце концов, это окажется грязным. –

ответ

4

Проблема заключается в том, что если Person не использует INotifyPropertyChanged, у вас нет способа отслеживать, когда изменяется свойство в экземпляре лица.

Обязывающее так:

<Label Text="{Binding Path=Person1.Name}"/> 

Не изменяет Person1экземпляр, а скорее свойство в пределах одного экземпляра. Если этот класс не реализует INPC, вы никогда не увидите, что свойство изменилось и никогда не поднимает ваше событие.

+0

Я знаю, что я мог бы реализовать модель inpc, но я думал, что модель не должна ничего знать о представлении, и только ViewModel должен обновлять представление. –

+0

INPC не связывает вашу модель с ViewModel или View. Это соглашение сигнализирует, когда что-то изменилось. – Romoku

+2

@ У AnkurSharma I (лично) нет проблем с моделью, реализующей INPC, но если вы хотите ее избежать, вам нужно будет обернуть модель в своей собственной виртуальной машине, чтобы реализовать этот интерфейс. Одной из основных причин существования виртуальной машины является внедрение INPC ... –

1

Вы должны обернуть объект Person в ViewModel также:

public class PersonViewModel : INotifyPropertyChanged 
{ 
    private Person _person; 

    public PersonViewModel(Person person) 
    { 
     _person = person; 
    } 

    public string Name 
    { 
     get 
     { 
      return _person.Name; 
     } 
     set 
     { 
      _person.Name = value; 
      RaiseNotifyPropertyChanged("Name"); 
     } 
    } 
} 

тогда ваш класс ViewModel будет выглядеть следующим образом:

public class ViewModel : INotifyPropertyChanged 
{ 
    public PersonViewModel Person1 
    { 
     get { return _person1; } 
     set 
     { 
      _person1 = value; 
      RaisePropertyChangedEvent("Person1"); 
      //So, whenever a property within my Person1 changes, raise event for that property. 
     } 
    } 
    public PersonViewModel Person2 
    { 
     get { return _person2; } 
     set 
     { 
      _person2 = value; 
      RaisePropertyChangedEvent("Person2"); 
     } 
    } 
} 
+0

Я рассматриваю это скорее как ActionModel, чем ViewModel, поскольку это единственная цель - передать изменения в Domain Model. – Romoku

+0

@Romoku: Я не знаком с разницей между ViewModel и ActionModel. Где я могу найти дополнительную информацию? – Maciej

+0

Я выкопаю его из своих закладок, когда вернусь домой. В двух словах разница является поверхностной, поскольку ViewModels привязаны к одному представлению, в то время как ActionModels являются общими и могут использоваться во многих ViewModels/Views. Эта концепция также проявляется в MVC, когда ваша страница может иметь несколько действий, не имея одного и того же ViewModel. – Romoku

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