0

私は、WPF プロジェクトで MVVM を初めて使用します。私の理解では、ビューはxamlファイル(ウィンドウ、グリッド、ユーザーコントロール)によって作成されたオブジェクトです。モデルは私のデータです。View-Model は他のオブジェクト インスタンスです。

すべての VM クラスを定義しましたが、質問は、VM インスタンスをインスタンス化するのに最適な場所はどこですか? より具体的には、VM メンバー変数を宣言し、new() 関数を呼び出す場所はどこですか?

現在、VM の静的メンバー変数を定義し、ユーザー コントロール内で宣言しています。VM は複数のビューからアクセスする必要があるため、静的として宣言しました。

静的変数またはグローバル変数を使用しているため、オブジェクト指向の設計からすると、ちょっと醜いと思います。

では、VM インスタンスを宣言する一般的な場所はどこでしょうか?

4

2 に答える 2

1

この問題を解決する良い方法は、MVVM-Light Framework のコード テンプレートのように、"Viewmodel-Locator" クラスでビューモデルを作成して共有することです。MVVM Light には、ビューモデルとサービスのインスタンス化を管理する小さな IOC コンテナーが付属しています。以下にサンプル コードを示します。まず、静的な方法でサービスとビューモデルを登録します。

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        //Resgister your Services
        SimpleIoc.Default.Register<IDataService, SomeDataService>();

        // Register your Viewmodels
        SimpleIoc.Default.Register<SomeViewModel>();
    }

登録済みの Viewmodel ごとにプロパティを作成して、viewmodelLocator クラスの外部からアクセスできるようにします。

 public SomeViewModel SomeVM
 {
     get
     {
         return ServiceLocator.Current.GetInstance<SomeViewModel>();
     }
 }

次に、XAML で ViewmodelLocator クラスにアクセスするために、たとえば App.xaml で global リソースを作成します。

 <Application.Resources>        
        <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
</Application.Resources>

次のように、データ コンテキストをビューにバインドします。

 DataContext="{Binding SomeVM, Source={StaticResource Locator}}"

最後に、viewmodel クラスで、サービスにアクセスして、必要なことを実行できます。

class SomeViewModel
{
    private IDataService mDataService;

    public SomeViewModel(IDataService _dataService)
    {
        mDataService = _dataService;

        // Do the fancy stuff...
    }
}

これが役に立てば幸いです!

于 2013-09-29T12:06:10.187 に答える
0

私は個人的に「KEEP IT SIMPLE STUPID」アプローチを使用しています。 NameSpace Models と呼ばれる Models フォルダーと NameSpace ViewModels という ViewModel フォルダーがあります。

Models フォルダーには、WCF サービスから取得したデータをレプリケートするストレート データが保持されます。これは、EDM にも使用できます。

ViewModels フォルダーには、特定のウィンドウまたはページに必要な実際のデータが保持されます。つまり、年と特定のクライアントのリストが必要な場合があるため、ViewModel は「モデル」フォルダーの YearList モデルを呼び出し、「モデル」からクライアント モデルを呼び出します。フォルダ。

すなわち

ビューモデル

class ClientDetailsViewModel
{
    public ClientModel ClientModel { get; set; }
    public YearListModel YearList { get; set; }

    public ClientDetailsViewModel(ClientModel _ClientModel)
    {
        ClientModel = _ClientModel;
        YearGroupList = new YearGroupListModel();
    }
}

次に、ViewModel を Window または Form にバインドし、次の例を使用してデータをバインドします。

{Binding ClientModel.ID}
{Binding YearGroupList.Years.ID}
于 2013-09-29T16:41:35.417 に答える