4

私はMVVMから始めて、物事を理解し始めています。私は現在Cinchフレームワークを実験していますが、まだコミットしていません。
ビューの背後にあるコードでViewModelへの参照を持ち、プロパティに[Dependency]があり、セッターでUnityを使用してDataContextを正しいビューに設定することにより、ViewModelsをビューに挿入していました。きちんとしたトリックだと思いました。

アプリを単一のウィンドウとして機能させ、ビューを挿入しようとしています(複数のウィンドウを開いたり閉じたりするのではなく)ビューをWindowsからUserControlsに変更し、メインウィンドウにを追加しました。それは機能しましたが、おそらくXAMLがContainer.Resolveを使用してビューを作成しないため、ViewModelが挿入されませんでした。ビューを作成し、コードビハインドで手動で追加したときのように、[依存関係]が作成されました。 。

XAMLを介してビューを追加したり、UIアクションなどの結果としてビューが変更されたりした場合に、Unityを介してビューを取得し、魔法のように機能するように、ウィンドウを設定するにはどうすればよいですか?

4

2 に答える 2

4

この問題は通常、リージョンと RegionManager を使用して解決されます。メイン ウィンドウの ViewModel で、Region のセットが作成され、RegionManager に追加されます。その後、ViewModel を解決して Region.Views コレクションに追加できます。

XAML では、Region は通常、ItemsControl の ItemsSource プロパティをメインの ViewModel の region プロパティにバインドすることによって挿入されます。

したがって、メイン画面の ViewModel には次のようなものがあります。

    public class TestScreenViewModel
{
    public const string MainRegionKey = "TestScreenViewModel.MainRegion";

    public TestScreenViewModel(IUnityContainer container, IRegionManager regionManager)
    {
        this.MainRegion = new Region();
        regionManager.Regions.Add(MainRegionKey, this.MainRegion);
    }

    public Region MainRegion { get; set; }
}

これは通常、IModule で解決されます

        #region IModule Members

    public void Initialize()
    {
        RegisterViewsAndServices();

        var vm = Container.Resolve<SelectorViewModel>();
        var mainScreen = Container.Resolve<TestScreenViewModel>();
        mainScreen.MainRegion.Add(vm);

        var mainView = ContentManager.AddContentView("Test harness", mainScreen);
    }

    #endregion

そして、あなたのテンプレートのXAML表現は次のようになります

    <DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}">
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" />
        </StackPanel>
    </ScrollViewer>
</DataTemplate>
于 2009-11-16T14:02:30.600 に答える
3

問題を解決する方法は、ウィンドウにViewModelも含めるようにし、UserControlsのViewModelsをプロパティとして公開することです。次に、ウィンドウのXAMLで、バインディングメカニズムを使用して、UserControlのDataContextをメインのViewModelの適​​切なプロパティにバインドします。そして、そのメインのViewModelはUnityコンテナーから解決されるため、必要に応じて他のすべてのViewModelが注入されます。

于 2009-11-15T02:32:49.713 に答える