0

Prism Silverlight5 には、2 つの垂直領域 (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 を使用したビュー インジェクションを確認する必要がある場合があります。複数の投稿で見たように:

        [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 に答える