让Unity在XAML中解析视图

时间:2009-11-14 22:32:10

标签: xaml mvvm dependency-injection unity-container cinch

我开始使用MVVM,我开始理解它。我目前正在试验Cinch框架,尽管我还没有做到这一点 我通过在视图的代码隐藏中引用ViewModel,将ViewModel注入到Views中,其中属性具有[Dependency],并且在setter中使用Unity将DataContext设置为右视图。我想,整洁的把戏。

我正在尝试让我的应用程序作为单个窗口工作,具有注入视图(与多个窗口相对并处理打开\关闭它们) 我将视图从Windows更改为UserControls,并在主窗口中添加了一个。 这很有效,但ViewModel从未被注入,大概是因为XAML不使用Container.Resolve来创建视图,就像我创建视图并使用Resolve在代码隐藏中手动添加它一样,创建了[Dependency]

如何设置我的窗口,以便如果我通过XAML添加视图,或者视图因UI动作等而发生变化,它会通过Unity获取它,以便它可以发挥其魔力? / p>

2 个答案:

答案 0 :(得分:4)

通常使用Regions和RegionManager解决此问题。在主窗口ViewModel中,创建一组区域并将其添加到RegionManager。然后可以解析ViewModels并将其添加到Region.Views集合中。

在XAML中,通常通过将ItemsControl的ItemsSource属性绑定到主ViewModel的region属性来注入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>

答案 1 :(得分:3)

解决问题的方法是让你的窗口也有一个ViewModel,UserControls的ViewModels作为属性公开。然后在您的XAML窗口中,您只需使用绑定机制将UserControl的DataContexts绑定到您的主ViewModel的正确属性。由于主要的ViewModel是从Unity容器中解析出来的,因此可以根据需要注入所有其他ViewModel。