0

在 Prism Silverlight5 中,我有一个外壳,它分为两个垂直区域(leftRegion,rightRegion)& Module1 中有 2 个视图,即(View1,View2)。
在 leftRegion 我有一个 View1 加载它有一个按钮。
我想使用 ViewModel 和 MEF.ViewModel 代码在 rightRegion 上动态加载 View2:

    [Export(typeof(LeftViewViewModel))]
public class LeftViewViewModel:ViewModelBase,IViewModel
{
    [Import]
    public IRegionManager CullingRegion { get; set; }

    [ImportingConstructor]
    public LeftViewViewModel(LeftView view)
        :base(view)
    {
        LoadCommand = new DelegateCommand(LoadControl,CanLoadControl);
    }

    private void LoadControl()
    {
        CullingRegion.RegisterViewWithRegion("RightRegion", typeof(RightView));
    }

    protected bool CanLoadControl()
    {
        return true;
    }

    public DelegateCommand LoadCommand { get; set; }
}

LeftView.xaml.cs 是:

    [Import]
    public ViewModels.IViewModel ViewModel
    {
        get { return (IViewModel) DataContext; }
        set { DataContext = value; }
    }

IModule 实现是:

[ModuleExport(typeof(CullingModuleModule1))]
public class CullingModuleModule1:IModule
{
    [Import]
    public IRegionManager CullingRegion { get; set; }

    public void Initialize()
    {

        CullingRegion.RegisterViewWithRegion("ShellContentRegion", typeof (Container));
        CullingRegion.RegisterViewWithRegion("LeftRegion", typeof(LeftView));


    }
}
4

1 回答 1

0

首先,我认为您的 ViewModel 不应该被 View 引用。
您可能需要查看使用 MEF 的 View Injection。正如我在多个帖子中看到的那样:

        [Export]
        public class YourViewClassName : UserControl
        {
            public YourViewClassName()
            {
            }
            [Import]
            public ILeftViewModel 
            {
                get { return (ILeftViewModel )DataContext; }
                set { DataContext = value; }
            }
        }

        [Export(typeof(LeftViewViewModel))]
        public class LeftViewViewModel : ILeftViewModel //ILeftViewModel inherits from IViewModel
        {
            public LeftViewViewModel()
            {
            }
        }

内部模块初始化器:

CullingRegion.Regions[YourRegionName].Add(ServiceLocator.Current.GetInstance<YourViewClassName>());

希望能帮助到你

于 2012-09-26T15:25:43.963 回答