2010-07-12 3 views
1

Я новичок в MVVM и WPF. так что будьте спокойны со мной.Вопрос MVVM, Событие пожара в представлении

У меня есть модель (модель A) в MVVM, в ViewModel У меня есть коллекция. Коллекция присутствует в представлении View ListView. У меня есть другая модель (модель B - не ui модель), которая должна что-то делать каждый раз, когда меняется список.

Как я могу предупредить модель B о смене выбора? Каким будет правым способом?

  • В случае, если модель A (ViewModel) будет срабатывать, а модель B будет ловить?
  • Прикрепленное свойство модели A?
  • Уведомление об изменении недвижимости?
  • Передача команд реле из модели B в модель A?

ответ

1

Использование Публикация/шаблон Подписчик

Лично я бы посылать команды из виртуальной машины VM и сделать их обновить модель

надеюсь, что это помогает

+0

Я предпочитаю не добавлять внешние наборы инструментов, как вестник или единство. Команды звучат хорошо. Но у меня все еще есть вопрос: Как передать изменение выбора из представления в ViewModel? По коду в представлении, или есть другой (классный) способ? – AmirE

+0

@AmirE: Надеемся, что ваш ListView привязан к коллекции в ViewModel. Аналогично вам необходимо привязать свойство SelectedItem в представлении к свойству в ViewModel, чтобы вы могли выбрать элемент без каких-либо дополнительных уведомлений. – Amsakanna

+0

@AmirE Если вам не нравятся фреймворки, которые в порядке, то Puplish/Subscriber, а также Observer - это всего лишь шаблоны, которые помогут вам разогнать события. Они только что уже переплели ... Посмотрите также на Triggers (так как вы не на Silverlight) и Behaviors, который запускает команды -> ICommand –

1

Я бы либо

  1. Экспозиция события в ViewModel A, на который может быть подписана ViewModel B. Затем я бы поднял это событие в любое время, когда выбор изменится.
  2. Рычаги INotifyPropertyChanged для уведомления ViewModel B

Я предпочитаю вариант 1, потому что это делает его более очевидным, что вы пытаетесь сделать. Плюс это более эффективно (у вас нет запаха кода, фильтрация которого изменилась, а затем сделайте какое-то действие.)

IMHO Я думаю, что команды реле должны использоваться только как интерфейс между представлением и viewmodel, чтобы помочь в разделение проблем. Но когда вы программируете из класса в класс, просто используйте стандартные соглашения ООП.

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

public class ViewModelA 
{ 
    public event EventHandler SelectedObjectChanged; 

    public IList<MyObject> ObjectList {get;set;} 
    public MyObject _SelectedObject; 
    public MyObject SelectedObject 
    { 
    get { return _SelectedObject;} 
    set 
    { 
     _SelectedObject = value; 
     if (SelectedObjectChanged != null) 
     SelectedObjectChanged(value); 
    } 
    } 
} 
Смежные вопросы