私は MVVM を実装しようとしてきましたが、ほとんどの場合、MVVM が気に入っています。ほとんどの質問に対する答えを見つけることができましたが、完全に欠けているか、実際に得られないことが 1 つあります。サーバーからRIAサービス経由で送信されるデータに関するものです。
ViewModel でモデル データを公開するためのほとんどの例では、モデル全体をプロパティとして公開するという 2 つの方法のいずれかを行っているようです (私はこのアプローチが好きではありません)。
public class MyViewModel : [SomeBaseClass]
{
private MyModel _model;
public MyModel Model
{
get { return _model; }
set
{
if(_model == value)
return;
_model = value;
PropertyChanged("MyModel");
}
}
}
または、モデルからビューに公開する個々のプロパティを実装します。これは私が行ってきた方法ですが、かなりの追加作業です。
ObservableCollection<TEntity>
オブジェクトのリストを使用した多くの例では、TEntity が RIA によって生成されたクラスである (またはジェネリック コレクションの何らかのバージョン)を公開し、それをコントロールの ItemsSource などにバインドするコードを示しています。ここまではよかった。しかし、そのバインドされたオブジェクトに基づいてコマンドを処理する必要がある場合はどうなりますか? これまでのところ、これを処理するためにObservableCollection<CustomViewModel>
. サーバーからデータを取得したら、返されたコレクションをループして CustomViewModel に「変換」し、コレクションに入れます。このような:
LoadOperation load = Context.Load(Context.GetTasksForUserQuery(userId));
load.Completed += (s, e) =>
{
if (!load.HasError)
{
_userTasks = new ObservableCollection<TaskItemViewModel>();
foreach (Task entity in load.Entities)
_userTasks.Add(new TaskItemViewModel(entity, Context));
}
}
これで、TaskItemViewModel クラスに必要に応じてコマンドなどを追加できるようになりました。しかし、これは最適とは言えません。
優れた例 (現在の日付) は次のとおりです: Silverlight の Telerik ドメイン サービスへの MVVM アプローチ この例は、サーバー側のページング、フィルタリング、グループ化などを有効にし、非常にうまく機能します。この場合も、RIA オブジェクトのコレクション (この場合は顧客のリスト) にバインドされます。バインドされたアイテム レベルでいくつかのコマンドを処理したい/処理する必要がある場合はどうすればよいですか?
私は何が欠けていますか?メタクラスと共有コードを使用できることは知っていますが、私のプレイ/試してみると、法案に合わないようです。のコレクションにバインドできるようにする方がはるかに簡単です<RIAObject>
。それを行い、「アドオン」コマンドを使用する方法はありますか? ヘルプ/考え/入力は素晴らしいでしょう!
ありがとう、クリス