Wpf 吉恩斯确实是我想要的。他提供的交换机是我实现的关键,但我对它做了一些调整

Wpf 吉恩斯确实是我想要的。他提供的交换机是我实现的关键,但我对它做了一些调整,wpf,mvvm,view,navigation,prism,Wpf,Mvvm,View,Navigation,Prism,首先,我将UnityContainer传递给它,这样我可以获得更多的灵活性。(至少我认为这给了我一些启示。) 其次,我创建了一个方法LoadModule(因为我有一个模块化结构),如下所示 public void LoadModule(string module) { IModuleManager moduleManager = m_UnityContainer.Resolve(); moduleManager.LoadModule(modu

首先,我将UnityContainer传递给它,这样我可以获得更多的灵活性。(至少我认为这给了我一些启示。) 其次,我创建了一个方法LoadModule(因为我有一个模块化结构),如下所示

public void LoadModule(string module) { IModuleManager moduleManager = m_UnityContainer.Resolve(); moduleManager.LoadModule(module); } 这很有效

一些值得注意的提示: -`//为视图提供上下文(ViewModel)的属性

    [Dependency]
    public HelloWorldViewModel HelloWorldViewModel
    {
        set
        {
            this.DataContext = value;
        }
    }
  • 将ViewModel作为视图代码隐藏的属性连接到视图的
  • this.Container.RegisterType()
  • 我通过以下方式注册模块:
`类型HelloWorldType=typeof(HelloWorldModule)
this.ModuleCatalog.AddModule(新的ModuleInfo()

-我的交换机在我的基础设施模块上。视图的创建被发送到有它的模块上,这解决了我的问题

我希望这不会太让人困惑,我真的想听听我是如何做这件事的……我这样做是“正确”的吗?有没有更优雅的方式? 诸如此类的事情

无论如何,我希望这能帮助和激励那些试图学习棱镜的人


PS:这个代码标签是如何工作的?我可以更改标签吗?mvvm light已经没有任何意义了。

下面是我的答案,我解释了如何使用
DataTemplateSelector来执行此操作。
:。我的解决方案也可以在几次更改后应用于Silverlight。谢谢你友好的回答!你已经找到了我想要的。我一直在阅读一篇文章很多关于prism以及如何使用它的东西。我发现了这些很棒的系列。我认为它涵盖了所有的基础知识。但是我仍然在努力理解基础知识。我现在的另一个简单疑问是;-我需要一个区域经理-我还需要一个ViewModels的经理;这叫做IoC,对吗?这和服务差不多cator对吗?这两个管理器都可以通过DI或“服务定位器”获得,就像mvvm light提供的一样,对吗?对于noob问题很抱歉:)谢谢!我说的那个系列…是的,你要找的是一个IoC(控制反转)容器。是的,非常接近ServiceLocator。我以前使用过Unity,它非常灵活。拿你的选择来说——我唯一想说的是,我不知道我是否会从MEF开始,因为它完成了一些不同的事情。一旦你启动一两个屏幕并运行起来,整个事情就会变得容易多了……又来了!过去几天我一直在学习prism,现在是使用交换机解决方案的时候了。不幸的是,我不知道如何使用它。我正在为我的程序做一个模块化的结构。我有一个接口,一个shell和另外两个模块(一个loginModule和一个helloWorld,后者在成功登录后启动)。通过交换机的loadView,我可以加载新的视图,而且效果很好,但前提是我创建了视图。我的问题是,我应该把总机,因为他需要创造新的看法,以及。。。如果这让人困惑,我很抱歉…我忘了添加。。。循环依赖关系正在成为我试图解决这个问题的方式中的一个问题。为什么?因为我已经将交换机放在我的基础架构模块上,并添加了引用以从其他模块获取视图。这在一定程度上是可行的,但我觉得这是一个更好的方法。我认为这个问题就是为什么你展示了注册视图部分的原因,但是我不知道如何使用它。。。有人能帮我吗?无论如何,非常感谢大家! public void LoadModule(string module) { IModuleManager moduleManager = m_UnityContainer.Resolve(); moduleManager.LoadModule(module); }
public void Initialize()
    {

        Switchboard switchboard = Switchboard.GetSwitchboard();

        IUnityContainer container = switchboard.GetCatalog();

        switchboard.LoadView(RegionNames.ShellMainRegion, container.Resolve<HelloWorldView>());

    }
    [Dependency]
    public HelloWorldViewModel HelloWorldViewModel
    {
        set
        {
            this.DataContext = value;
        }
    }
        {

            ModuleName = ModuleNames.HelloWorldModule,

            ModuleType = HelloWorldType.AssemblyQualifiedName,

            InitializationMode = InitializationMode.OnDemand

        }); `