私はMVVMに入り、Prismフレームワークから始めました。サンプルアプリケーションでは典型的なナビゲーションがあります。ページの1つにいくつかのアプリケーションがリストされていなければなりません。実装の違いについては不思議でした。ここではそれをシンプルに保つために、コードからいくつかの小さな断片は、これまで以下のとおりです。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に関するいくつかの質問では、私が行ったようにViewModelsのObservableCollection
を保存するかどうかを質問しましたが、モデルは表示しませんでした。それらのバージョンは他のものよりも?
はさらに私はApplication
クラスの変化がApplicationPageViewModel
クラスに反映させるか、私はCollectionChanged
イベントにフックする必要がある場合には(私はこのテクニックを見たブライアンLagunas'ウェビナーから見た)かどうかを知ることに興味がありました。これまでのところ私はDelegateCommands
場合RelayCommand
Sの次の実装を持つときunnecesary膨張/呼び出しを防ぐために、手動でRaiseCanExecuteChanged
メソッドを呼び出すためにCollectionChanged
イベントにこのフックを見てきました:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
あなたの質問は基本的に、それらが変更されたコレクションに関するアイテムを通知する方法です。 1)ViewModelインスタンスを各アイテム(コンストラクタなど)に渡します。アイテムはViewModelのイベントにサブスクライブできます。イベントはViewModel(またはアイテムによっても)によって上げられます。2)ViewModelはすべての変更と通知を(呼び出しによって)処理します。コレクションの変更に関する各アイテムメソッド)。 'INotifyPropertyChanged'(これはあなたが聞いているイベントです)を実装すると、メソッド(1)がボックスの外に出てきます。 – Sinatr