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