2016-04-11 1 views
1

Я попадаю в MVVM и начинаю с рамки Prism, и в моем примере приложения у меня типичная навигация. На одной из страниц должно быть указано несколько приложений, и мне было интересно узнать о различиях в реализации. Для простоты здесь некоторые небольшие фрагменты из кода до сих пор:Распространение события ObservableCollection и правильное использование в MVVM

Применение Модель

public class Application : BindableBase 
{ 
    private string _commandLine; 
    private string _name; 
    private string _smallIconSource; 

    public string CommandLine 
    { 
     get { return _commandLine; } 
     set { SetProperty(ref _commandLine, value); } 
    } 

    public string Name 
    { 
     get { return _name; } 
     set { SetProperty(ref _name, value); } 
    } 

    public string SmallIconSource 
    { 
     get { return _smallIconSource; } 
     set { SetProperty(ref _smallIconSource, value); } 
    } 
} 

ApplicationPage ViewModel

public class ApplicationPageViewModel : BindableBase 
{ 
    private ObservableCollection<Application> _applicationCollection; 

    public ApplicationPageViewModel() 
    { 
     // load some collection entries here 
    } 

    public ObservableCollection<Application> ApplicationCollection 
    { 
     get { return _applicationCollection; } 
     set 
     { 
      // if (_applicationCollection != null) 
      //  _applicationCollection.CollectionChanged -= ApplicationCollectionChanged; 
      SetProperty(ref _applicationCollection, value); 
      // if (_applicationCollection != null) 
      //  _applicationCollection.CollectionChanged += ApplicationCollectionChanged; 
     } 
    } 
} 

ApplicationPage Посмотреть

<!-- ... --> 
<ItemsControl ItemsSource="{Binding ApplicationCollection}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <!-- some kind of representation of applications --> 
      <Label Content="{Binding Name}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
<!-- ... --> 

В некоторых примерах кода в Интернете, особенно в некоторых вопросах здесь, на SO, я видел, как люди спрашивают, следует ли хранить ObservableCollection ViewModels, а не модели, как и я. Мне было любопытно, когда бы вы выбрали любой из эта версия над другой?

Кроме того, я был заинтересован в знании, отражают ли изменения в Application классе в ApplicationPageViewModel классе, или если я должен внедриться в CollectionChanged событие (как это видно из вебинаров Брайана Lagunas', где я видел эту технику). До сих пор я только видел этот крюк в CollectionChanged события для вызова метода RaiseCanExecuteChanged если DelegateCommands вручную, чтобы предотвратить unnecesary раздувания/вызовов при наличии следующей реализации RelayCommand с:

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 
+0

Ваш вопрос в основном заключается в том, как сообщать элементы о той коллекции, в которой они были изменены. Я мог бы подумать: 1) передать экземпляр ViewModel для каждого элемента (конструктора или что-то еще), элемент может подписаться на какое-то событие ViewModel, событие обрабатывается ViewModel (или даже по элементу) 2) ViewModel обрабатывает все изменения и уведомления (путем вызова каждый пункт способ по изменению коллекции). Метод (1) выдается в поле, если вы реализуете 'INotifyPropertyChanged' (это событие, которое вы будете слушать). – Sinatr

ответ

0

я хотел бы использовать ViewModels если недвижимость в изменение коллекции. Если данные по элементу не меняются, на самом деле это не имеет значения, если вы используете виртуальную машину или модель и именно так вы ее предпочитаете. Мне лично нравится обертывать свои модели в ViewModels, так как я могу легко добавить комбинированные свойства для отображения, которые я не хочу иметь прямо в своих моделях.

Если вы хотите сделать какие-то действия на ApplicationPageViewModel, когда изменения приложений, вы должны

  • Используйте ViewModel для применения
  • Подключайте событие INotifyPropertyChanged каждого приложения ViewModel
  • Everytime вы добавьте новое приложение, также добавьте слушателя в это приложение

Если вы просто хотите сделать некоторые действия при добавлении приложения или удалены, вам не нужно использовать ViewModel и просто зарегистрировать событие CollectionChanged для ObservableCollection

+0

Хорошо, это проясняет некоторые вещи. Тем не менее мне интересно, если вы используете ViewModels для включения некоторых комбинированных свойств, которые вы определенно полагаетесь на шаблон Facade, не так ли?Разве этот подход не делает ремонтопригодность более сложной и заставляет вас писать дубликат кода для доступа к тем же свойствам, которые вы не хотите скрывать? –

+0

Для моего текущего проекта im использует оболочку DynamicObject для ViewModels, где я просто хочу добавить некоторые свойства или функции зависимости от просмотра. Это не самый быстрый способ, но очень удобный, поскольку мне не нужно дублировать код для свойств, но просто назначьте Model для ViewModel. Для моих моделей у меня нет возможности зарегистрироваться на изменения, так как он не реализует интерфейс INotifyPropertyChanged, а содержит только данные. – Spongebrot

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