3

私はWPFとMVVMを初めて使用し、アプリの設計方法に多くの苦労をしており(したがって、ここで多くの質問があります)、リファクタリングを実行しようとしています。SQLバックエンドがあり、LINQtoSQLを使用しているので、LINQTOSQLが生成するクラスが私のモデルになります。モデルクラスをビューから遠ざける方法の優れた包括的な例はまだ見ていません。現在見ている例では、ビューはModelClass.Somethingを参照するViewModelプロパティではなく、ModelClass.Somethingにバインドされています。これが悪いと思うのは正しいですか(そのフィールドがデータベースで変更された場合、ビューが壊れます)?

現在私が苦労しているのはドロップダウンリストです。例:IDとテキストフィールドを備えたMessageTypeというルックアップテーブルと、それらをフェッチするためのリポジトリメソッドがあります。したがって、私のビューでは、DisplayMemberPathパスとSelectedValueパスをモデルの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;
}

また、MessageTypeへの外部キーを持つMissionオブジェクトがあるので、この新しいクラスがある場合、コンボボックスのSelectedItemをmission.MessageTypeにバインドするにはどうすればよいですか?ミッションオブジェクト、その子、およびその親のパターンを取得するのに本当に苦労しており、MVVMを使用してCRUD操作を行っている包括的な例を見つけることができません。私は上を行き過ぎているのですか、それとも何かが足りないのですか?

4

3 に答える 3

3

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

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

この記事が役立つ場合があります:http://msdn.microsoft.com/en-us/magazine/ff798279.aspx、特にコレクションのセクション。

于 2012-04-20T12:34:52.290 に答える
1

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

MissionViewModelのようなものにバインドされたビューで作業していて、ゲッターを表示したプロパティにバインドされたオプションを入力するドロップダウンがあると仮定すると、MessageTypeあなたが行っていることは問題ないと思います。

ドロップダウンリストにMessageTypeオブジェクトを(にバインドして)入力すると、デフォルトで各アイテムItemsSourceの呼び出し結果が表示されます。ToString()それでも希望する結果が得られない場合は、ビューモデルを使用IValueConverterするか、必要なものを表示するための実装を作成することができます。

ドロップダウンにMessageTypeオブジェクト自体ではなくビューモデルがある場合は、を使用してビューモデルをに変換するmission.MessageTypeことでバインドできます。この変換を実行するには、次のことができますSelectedItemIValueConverterMessageType

MessageTypeA.ビューモデルのパブリックプロパティとして原資産を公開する、B。変換操作がプライベートフィールドにアクセスできるよう
にビューモデル自体を実装する、または C.ビューモデルのネストされたクラスとしてを作成するプライベートフィールドにアクセスできるようにIValueConverterMessageType
IValueConverterMessageType

オプションBの欠点の1つは、XAMLにコンバーターを追加するためにパブリックパラメーターなしのコンストラクターが必要になることですResourceDictionary

于 2012-04-20T12:43:23.100 に答える
0

ビューモデルからビューから直接アクセスするのではなく、コマンドを使用する必要があります。その逆も同様です。Model-View-ViewModelデザインパターンを使用したWPFアプリを参照してください

于 2012-04-20T12:23:45.000 に答える