无法让我的ViewModelLocator工作

3

我有一个名为MainViewModel的ViewModel(当然),其中包含多个构造函数,如下所示:

[ImportingConstructor]
public MainViewModel(IWindowManager windowManager)
    : this(windowManager, new DataProvider(), new LocalJsonPersistenceManager())
{
}

[PreferredConstructorAttribute]
public MainViewModel(IWindowManager windowManager, IInformationProvider infoProvider,
                     IPersistenceManager persistenceManager)
{
    //generating data, handling clicks etc.
}

在那个 ViewModel 中,有一个公共的项目,它会不断地更新(每当用户点击某个按钮并在表单上执行一些操作时):

public Item ClickedItem
{
    get { return clickedItem; }
    set
        {
            clickedItem = value;
            NotifyOfPropertyChange(() => ClickedItem);
            if (ClickedItem != null)
            {
                FindNextItem();
            }
        }
}

现在我正在构建一个包含ListView的UserControl,我个性化了它使其成为一个具有粘性标题的ListView(每当到达下一个标题时,标题会向上移动),因为我只能通过GroupStyled ListView实现这一点,所以我必须在C#代码后台构建ListView的数据。
编辑: 我正在尝试使用ViewModelLocator,如下:
public class ViewModelLocator
    {
        public ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            if (ViewModelBase.IsInDesignModeStatic)
            {
                // Create design time view services and models
                //SimpleIoc.Default.Register<IDataService, DesignDataService>();
            }
            else
            {
                // Create run time view services and models
                //SimpleIoc.Default.Register<IDataService, DataService>();
            }

            SimpleIoc.Default.Register<MainViewModel>();
        }


        public MainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<MainViewModel>();
            }
        }

        public static void Cleanup()
        {
            // TODO Clear the ViewModels
        }
    }

我正在这样调用数据的具体值:

var vm1 = (new ViewModelLocator()).Main;
            testtxt.Text = vm1.ClickedItem.Name;

但是它在运行时一直给我一个错误信息,指向以下代码行:
        return ServiceLocator.Current.GetInstance<MainViewModel>();

在 ViewModelLocator 的代码块中:

public MainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<MainViewModel>();
            }
        }

出现错误信息{"Type not found in cache: Caliburn.Micro.IWindowManager."},一个InnerException消息为null

2个回答

1

1
看起来MEF无法构建您的ViewModel所依赖的IWindowManager。尝试至少从Caliburn注册默认实例。
更新
直接从caliburn.Micro的MEF-Bootstrapper中获取:
container = CompositionHost.Initialize(
                new AggregateCatalog(
                    AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
                    )
                );

var batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);
container.Compose(batch);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接