2015-11-15 2 views
1

Я разрабатываю ViewModel на основе BindableBase. Эта виртуальная машина содержит экземпляр модели домена. VM предоставляет свойство, например Name, из которого я хочу не использовать локальное хранилище (т. Е. Хранилище в VM), а скорее делегировать свойство объекта модели. Я хотел бы использовать SetProperty(), но ссылка на хранилище не может быть свойством. Должен ли я реализовать INotifyPropertyChanged? Разве это вообще хорошая идея делегировать модель таким образом? Можно ли расширить BindableBase (или команду, чтобы добавить), чтобы покрыть это?Prism BindableBase.SetProperty()

+0

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

+0

Я новичок, чтобы начать потоки StackOverflow, кажется, что поле комментариев довольно ограничено по размеру, поэтому я опубликую несколько комментариев по этому поводу: – EuroEager

+0

Я думаю, что существует как минимум 3 подхода к привязке к свойствам: 1: Bind непосредственно к свойству модели, которое предоставляет Модели представление. Я бы хотел этого избежать. 2: привязать свойство ViewModel, которое, в свою очередь, получит доступ к свойству модели. 3: Пуристый путь; Привяжите свойство ViewModel, которое полностью изолировано от Модели. Подход 2 - это (я думаю) практический подход, предполагающий взаимно однозначное отношение к свойству Модели. Подход 3 (я предполагаю) необходим, если нет взаимно однозначного отношения (например, вычисленного свойства какого-либо вида). – EuroEager

ответ

3

Итак, сначала вы должны выбрать, как вы будете архитектовать свои виртуальные машины и модели. Как вы упомянули, есть несколько вариантов. Самый простой и способ, которым я рекомендую, чтобы просто выставить вашу модель как свойство, а затем привязать свой вид к свойствам модели:

public class MyViewModel : BindableBase 
{ 
    private Person _myPerson; 
    public Person Person 
    { 
     get { return _myPerson; } 
     set { SetProperty(ref _myPerson, value); } 
    } 
} 

Если вы не хотите, чтобы сделать это, и предпочел бы обернуть каждую отдельную модель вы сделаете это так.

public class MyViewModel : BindableBase 
{ 
    private Person _myPerson; 

    private string _name; 
    public string Name 
    { 
     get { return _myPerson.Name; } 
     set { _myPerson.Name = value } 
    } 
} 

Имейте в виду, что ваш объект модели Person все еще должен внедрять INPC.

EDIT: Если у вас нет контроля над вашими моделями и им необходимо внедрить INPC, вы можете попробовать использовать ткачество IL или создать фасад/декоратор для своих моделей и обернуть их индивидуально.

public class MyPersonFacade : BindableBase 
{ 
    private Person _myPerson; 

    private string _name; 
    public string Name 
    { 
     get { return _myPerson.Name; } 
     set 
     { 
      _myPerson.Name = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

Затем используйте это как свою модель на своей виртуальной машине.

+0

Предположим, что модель Legacy и INPC не опция – EuroEager

+0

, тогда вы создаете фасад вокруг своей модели и реализуете INPC. Таким образом, у вас будет PersonFacade, который обертывает каждое свойство и вызывает INPC.При использовании SetProperty вы не можете использовать SetProperty. –

+0

Хорошо, спасибо. Похоже, что «невозможно» перегрузить метод SetProperty, чтобы затем взять другое свойство вместо локального хранилища. Я могу жить с моей «собственной» реализацией INPC (RaisePropertyChanged с использованием атрибута CallerMemberName и т. Д.) – EuroEager