获得统一解决XAML意见
-
20-09-2019 - |
题
我开始了与MVVM,和我开始明白的事情。我目前正在与莲花框架尝试,虽然我没有承诺把它作为呢。结果 我被注入的ViewModels到由具有在视图的代码隐藏到视图模型的基准,与具有在其上的[依赖]该资源使用的意见,和在设定器它设置在DataContext于右视野,使用统一。巧妙的方法,我想。
我试图让我的应用程序作为一个窗口工作,用注射的观点(而不是多个窗口和处理开\关它们) 我改变了我的看法从Windows到用户控件,并且加入了到主窗口。 这工作,但视图模型从未注射,大概是因为XAML不使用Container.Resolve创建视图,当我创建的视图,并在代码隐藏使用解析手动添加呢,[相关]创建
我如何设置我的窗口,因此,如果我通过XAML添加视图,或视图被改变UI操作的结果等,它得到它通过统一,这样才可以工作它的魔力?
解决方案
为您解决问题的方法是使你的窗口有一个视图模型以及与用户控件的暴露的ViewModels作为它的属性。然后在你的XAML的一个窗口,你只需使用绑定机制,以用户控件的DataContexts绑定到你的主视图模型的适当性。而且,由于是主视图模型是从团结容器解决,将有其他的ViewModel-S需要注射。
其他提示
此问题是使用区域和RegionManager通常解决。在主窗口视图模型,一组区域被创建并添加到RegionManager。随后的ViewModels可以解决,并添加到收藏Region.Views。
在XAML,该区域一般是由具有连接到主视图模型的区域属性一个ItemsControl的ItemsSource属性注入。
因此,在主屏幕视图模型,你会是这样的:
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>
不隶属于 StackOverflow