gpt4 book ai didi

c# - Prism 6.1 ViewModelLocator 没有实例化我的 ViewModel

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:54 24 4
gpt4 key购买 nike

我最近刚刚建立了一个新项目,使用 Prism 6.1(带 Unity)。

我有我的 Bootstrap :

public class ServerBootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<MainShell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
}
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog catalog = (ModuleCatalog)ModuleCatalog;
catalog.AddModule(typeof(ServerUIModule));
}
}

主壳:

<Window.Resources>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding DataContext.Title}" />
</Style>
</Window.Resources>
<DockPanel LastChildFill="True">
<TabControl regions:RegionManager.RegionName="{x:Static infrastructure:RegionsNames.MAIN_TAB_REGION}" />
</DockPanel>

我的模块定义:

public class ServerUIModule : IModule
{
private readonly IRegionManager m_regionManager;

public ServerUIModule( IRegionManager regionManager)
{
m_container = container;
m_regionManager = regionManager;
}

public void Initialize()
{
m_regionManager.RegisterViewWithRegion(RegionsNames.MAIN_TAB_REGION, typeof(StatusView));
m_regionManager.RegisterViewWithRegion(RegionsNames.MAIN_TAB_REGION, typeof(LogMessagesView));
}
}

我的状态 View :

<UserControl x:Class="Xms.Server.UI.Views.StatusView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Xms.Server.UI.Views"
xmlns:mvvm="http://prismlibrary.com/"
xmlns:statusControl="clr-namespace:Xms.Server.UI.Views.StatusControl"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Background="Aquamarine" mvvm:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<TextBlock>Content</TextBlock>
</Grid>
</UserControl>

对应的ViewModel:

public class StatusViewModel : BindableBase
{
public String Title => LocalizedResources.StatusModuleTitle;

public StatusViewModel()
{
//This constructor is never called
}
}

问题是我的构造函数从未被调用,我的 DataContext 未设置。

我该如何调试它?我做错了什么?

最佳答案

首先,确保 View 驻留在 Views 命名空间中, View 模型分别驻留在 ViewModels 中。

其次,调试此类事物的最简单方法是从 prism 源代码复制一些代码并将其放入 MyBootstrapper.ConfigureContainer:

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver( x =>
{
var viewName = x.FullName;
viewName = viewName.Replace( ".Views.", ".ViewModels." );
var viewAssemblyName = x.GetTypeInfo().Assembly.FullName;
var suffix = viewName.EndsWith( "View" ) ? "Model" : "ViewModel";
var viewModelName = string.Format( CultureInfo.InvariantCulture, "{0}{1}, {2}", viewName, suffix, viewAssemblyName );
return Type.GetType( viewModelName );
} );
ViewModelLocationProvider.SetDefaultViewModelFactory( type => Container.Resolve( type ) );

...并在此处放置断点以查看究竟是什么问题。或者,深入研究您的 XamlParseExceptionInnerException...在大约第三层您应该找到真正的问题。但我发现我的断点方法更方便。

关于c# - Prism 6.1 ViewModelLocator 没有实例化我的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35792126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com