4

Unity を使用して ViewModelLocator を構築し、それをシングルトン ViewModel インスタンスで正常に使用しています。例えば:

public class ViewModelLocator
{
    private static readonly UnityContainer Container;

    static ViewModelLocator()
    {
        Container = new UnityContainer();

        if (ViewModelBase.IsInDesignModeStatic)
        {
            //Design Time Data Services
            Container.RegisterType<IMyServiceServiceAgent, DesignMyServiceServiceAgent>();
        }
        else
        {
            //Real Data Services
            Container.RegisterType<IMyServiceServiceAgent, MyServiceServiceAgent>();
        }

        Container.RegisterType<TreeViewViewModel>(new ContainerControlledLifetimeManager());
    }

    public TreeViewModel ViewModel
    {
        get
        {
            return Container.Resolve<TreeViewModel>();
        }
    }
}

ViewModelLocator は、App.xaml でリソースとして定義されています。

<Application.Resources>
    <ResourceDictionary>
        <VMS:ViewModelLocator x:Key="ViewModelLocator" d:IsDataSource="True"/>
    </ResourceDictionary>
</Application.Resources>

これにより、次のように、任意のビューで ViewModel にバインドできます。

DataContext="{Binding TreeViewModel, Source={StaticResource ViewModelLocator}}" d:DataContext="{d:DesignInstance IsDesignTimeCreatable=False}"

私の質問は、同じ ViewModel の複数のインスタンスで同じパターン (およびブレンド可能性) を維持するにはどうすればよいですか?

この投稿で 私がやろうとしていることへの参照を見つけました ただし、実装の詳細には入りません。

私ができるようにしたいのは、これらの Views/ViewModel ペアの複数のインスタンスをさまざまなデータ ツリーに使用して、それらの間でコピー アンド ペーストできるようにすることですが、コンテナーを使用して ViewModelLocator 内の特定のインスタンスに対応する方法を考えることができませんか?

上記の投稿のように、ある種の ViewModels のコレクションが必要であると想定していますが、そのコレクションを Unity コンテナーに登録するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

あなたの状況で私がしたことは、ビュー用の ViewModel を 1 つだけ持つことですが、変更可能なデータを保持する別の ViewModel を用意することでした。

たとえば、ユーザー情報を表示する UserView コントロールがある場合、ViewModelLocator を介してそのビューにバインドされた単一の UserViewModel があります。また、表示/編集されている現在のユーザーに応じて変更できる UserModel クラスもあります。この UserModel クラスは ViewModelBase から継承され、プロパティを通じて UserViewModel クラスによって公開されます。アプリケーションの別の場所で、たとえばユーザーが選択されている場合、UserViewModel の User プロパティを、UserView に表示する UserModel に設定します。

于 2011-05-11T14:43:40.260 に答える