我开始使用MVVM,我开始理解它。我目前正在试验Cinch框架,尽管我还没有做到这一点 我通过在视图的代码隐藏中引用ViewModel,将ViewModel注入到Views中,其中属性具有[Dependency],并且在setter中使用Unity将DataContext设置为右视图。我想,整洁的把戏。
我正在尝试让我的应用程序作为单个窗口工作,具有注入视图(与多个窗口相对并处理打开\关闭它们) 我将视图从Windows更改为UserControls,并在主窗口中添加了一个。 这很有效,但ViewModel从未被注入,大概是因为XAML不使用Container.Resolve来创建视图,就像我创建视图并使用Resolve在代码隐藏中手动添加它一样,创建了[Dependency]
如何设置我的窗口,以便如果我通过XAML添加视图,或者视图因UI动作等而发生变化,它会通过Unity获取它,以便它可以发挥其魔力? / p>
答案 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。