2012-04-20 12 views
3

私はWPFとMVVMを使い慣れていないので、自分のアプリを設計する方法に多くの苦労をしています(ここではたくさんの質問があります)。私はSQLのバックエンドを持っており、LINQTOSQLが生成するクラスが私のモデルになるようにLINQtoSQLを使用しています。モデルクラスをビューから離しておく方法の包括的な例はまだ見ていません - 私が見ている例では、ViewはModelClass.Somethingを参照するViewModelプロパティを持つ代わりにModelClass.Somethingにバインドしています。私はこれが悪いと思うことで正解なのですか(ビューフィールドがdbで変わるとビューが壊れます)?MVVMデザインパターンの問題

私が現時点で苦労しているのは、ドロップダウンリストです。例:IDとテキストフィールドを持つMessageTypeというルックアップテーブルと、それらを取得するリポジトリメソッドがあります。私の見解では、DisplayMemberPathとSelectedValueパスをModelのMessageTypeクラスのフィールドにバインドしないようにしたいので、新しいクラスを作成してそのクラスのプロパティをViewModelに公開する必要がありますか?このように移入

public class MessageTypeViewModel : ViewModelBase 
{ 
    public MessageTypeViewModel(MessageType t) 
    { 
     MessageTypeText = t.messageTypeText; 
     MessageTypeId = t.messageTypeId; 
    } 
    public string MessageTypeText { get; private set; }//bind DisplayMember and SelectedValue to these properties 
    public int MessageTypeId { get; private set; } 
} 

:このよう

get 
{ 
if (textMessageSelectionOptions == null) 
    { 
     var list = repository.GetMessageTypes().Select(x=>new MessageTypeViewModel(x)).ToList(); 
     textMessageSelectionOptions =new ReadOnlyCollection<MessageTypeViewModel>(list); 
    } 
return textMessageSelectionOptions; 
} 

また、私は私が私ことを考えるとmission.MessageTypeにコンボボックスのSelectedItemのをバインドしますので、どのようにmessageTypeする外部キーを持っているミッションのオブジェクトを持っています今、この新しいクラスを持っていますか?ミッションオブジェクト、その子どもとその親のパターンを取得するのは本当に苦労しています。MVVMを使用してCRUD操作を行っている包括的なサンプルは見つかりません。私は上を行きますか、何かを見逃していますか?

+0

あなたのビューモデルが実際にクラスに動作を追加しない限り(例えば、 'INotifyPropertyChanged'実装やビュー固有のコマンド/プロパティ)、ビューモデルではラップしません - 不必要なメンテナンスが発生します –

答えて

3

MVVMの目的は、アプリケーションの保守性を向上させ、密接に結合したスパゲッティコードのデバッグに多くの時間を費やさなくて済むようにすることです。 MVVMパターンの純粋な実装がこれを実現する場合は、それを完全に適用する価値があります。一方、モデルクラスのViewModelプロキシを作成するのに多くの時間を費やしても、アプリケーションが小さく、作業が完了してもあまり変更されない場合、MVVMへの純粋なアプローチは過度のものかもしれません。

ビューにモデルを完全に公開しないようにするには、モデルのViewModel固有のバージョンを作成し、すべての依存関係(Mission - > MessageTypeなど)を複製する必要があります。それで再。

この記事は役に立ちました:http://msdn.microsoft.com/en-us/magazine/ff798279.aspx、特にコレクションのセクション。

+0

ありがとうリンク、それは私がまだそれをすべて理解していないが有用に見えます。私は実用的になり、私のドロップダウンデータのプロキシクラスを書くのを忘れてしまいます。それは、変更しそうもないことを考えれば、それぞれのクラスのために余分なクラスを作るのが一番上です。 – Nix

1

MessageTypeは本当に不変の値型なので、私はビューモデルは必要ではないと思います。

MissionViewModelのようなものにバインドされているビューで作業していて、ゲッターを表示したプロパティにMessageTypeオプションがバインドされているドロップダウンがあるとすると、私はあなたが何をしていると思います結構です。

MessageTypeオブジェクトをドロップダウンリストに挿入すると(ItemsSourceにバインドすることによって)、各項目にToString()という呼び出し結果がデフォルトで表示されるはずです。それがあなたの望む結果を得られない場合、あなたはビューモデルに行ったり、IValueConverter実装を作成して、あなたが望むものを表示することができます。あなたの代わりにMessageTypeのあなたのドロップダウンオブジェクト自体にビューモデルを持っている場合は

、あなたはMessageTypeにビューモデルを変換するIValueConverterを使用してSelectedItemからmission.MessageTypeをバインドすることができます。この変換を実行するには、

A.ビューモデルの公共財産として基礎となるMessageTypeを公開することができ、
B.は、ビューモデル自体は変換動作がプライベートMessageTypeフィールドにアクセスすることができますので、IValueConverterを実装します、または
C.は、それがアクセスできるように、再び、オプションBにプライベートMessageTypeフィールド

一つの欠点は、あなたがコンバータを追加するために公共のパラメータなしのコンストラクタが必要になりますということです、ビューモデルの入れ子になったクラスとしてIValueConverterを作成しますXAML ResourceDictionaryにあります。

関連する問題