0

我使用 Prism 和 MEF 创建了一个 WPF 应用程序。在一个模块中,我有一个客户列表。要编辑客户数据,我有一个视图“EditCustomer.xaml”。

用户可以编辑许多客户,因此他可以打开许多不同的 EditCustomer.xaml 实例。

这是 ViewModel 的代码:

[Export(typeof(EditCustomerViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class EditCustomerViewModel : ViewModelBase

XAML 的代码行为:

[Export(typeof(EditCustomerView))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class EditCustomerView : RadPane
{
    public EditCustomerView()
    {
        InitializeComponent();
    }

    [Import(typeof(EditCustomerView))]
    public object ViewModel
    {
        get
        {
            return this.DataContext;
        }
        set
        {
            this.DataContext = value;
        }
    }
}

“CreationPolicy.NonShared”属性完美运行,但是当我想绑定客户数据时,每个视图都与最后一个值绑定。我只想在新视图实例中加载和显示最新数据。

怎么可能?也许我忘记了什么?

在此先感谢您的帮助。

问候。

4

1 回答 1

0

我有一个菜单,通过单击项目加载视图,此代码来自我的 ShellViewModel:

private void ShowView(object viewName)
{
    IRegion region = this.regionManager.Regions[RegionConstants.CentralRegionName];

    object view = null;

    try
    {
        switch (viewName as string)
        {
            case ViewConstants.CustomerListViewName:
                view = ServiceLocator.Current.GetInstance<CustomerListView>();
                break;
            default:
                return;
        }

    if (region.Views.Contains(view))
    {
        region.Remove(view);
    }

    region.Add(view);
    region.Activate(view);
}

而且,在我在每个模块中的行为中,我可以从上下文菜单中加载其他视图,如下所示:

IRegionManager regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
                IRegion region = regionManager.Regions[RegionConstants.CentralRegionName];

                object view = null;
                switch (header)
                {
                    case "Update":
                        view = ServiceLocator.Current.GetInstance<UpdateCustomerView>();
                        IEventAggregator eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
                        eventAggregator.GetEvent<UpdateCustomerEvent>().Publish(new UpdateCustomerEvent { ID = custId});
                        break;
                    default:
                        break;
                }

                if (view != null)
                {
                    if (region.Views.Contains(view))
                    {
                        region.Remove(view);
                    }

                    region.Add(view);
                    region.Activate(view);
                }
于 2013-07-02T09:51:04.233 回答