MVVM を利用するようにアプリケーションをリファクタリングしています。List<Product>
以前は、ListView をバインドできる Application クラスに変数を保持していました。このリストは、私のデータ層を構成しました。この ListView を含むページは、マスター/詳細レイアウトです。MVVM では、List はデータ レイヤーであるため、ProductModel のインスタンスを保持する必要があると考えています。ViewModel にバインドする必要がある場合、別の ViewModel のリストも必要ですか?
1 に答える
MVVM については、別の見方をする必要があるかもしれません。View はコントロール (XAML) を含むページであり、ViewModel はデータ モデルとページの間の接着剤です。ビューのデータ コンテキスト全体が ViewModel に設定されます (サブスクライブする MVVM キャンプに応じて、XAML で直接、またはコード ビハインドで実行されます)。
あなたの例ではList<Product>
、ViewModel as に移動し、ViewModelObservableCollection<Product>
が INotifyPropertyChanged インターフェイスを実装していることを確認します。INotifyPropertyChanged は、ビューがバインディングの更新時期を知るために使用するコントラクトです。INotifyPropertyChanged 自体を実装ObservableCollection<T>
するため、リストの代わりに を使用します。ObservableCollection<T>
ビューの DataContext プロパティは、ViewModel のインスタンスに設定されます。ビューでは、ListBox コントロールのプロパティがコレクションItemsSource
にバインドするように設定されます。Product
その後、データ ストアと通信して監視可能なコレクションにデータを入力する役割を担うメソッドを ViewModel 内に持つことができます。
ビューモデル
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<Product> _products = null;
public ObservableCollection<Product> Products
{
get { return _products; }
set
{
if( _products != value )
{
_products = value;
if( this.PropertyChanged != null )
{
this.PropertyChanged( this, new PropertyChangedEventArgs( "Products" ) );
}
}
}
}
// have code in here that loads the Products list from your data store (i.e. service call to database)
}
コード ビハインドを表示
public MyView()
{
InitializeComponent();
this.DataContext = new MyViewModel();
}
意見
<ListBox
ItemsSource={Binding Path=Products, Mode=OneWay}
SelectedItem={Binding Path=SelectedProduct, Mode=TwoWay}
...
/>