无法使我的ViewModelLocator工作

时间:2014-06-10 10:47:25

标签: c# mvvm viewmodel mef caliburn.micro

我有一个名为MainViewModel的ViewModel(当然),它包含多个Contructors,如下所示:

[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();
            }
        }
}

现在我有一个UserControl我正在构建一个包含ListView的ListView,我将其设置为一个粘性的标题列表视图(当下一个标题到达blabla时标题会向上移动...)。因为我只能通过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>();
            }
        }

错误消息 {&#34;在缓存中找不到类型:Caliburn.Micro.IWindowManager。&#34;} ,以及 null 的InnerException消息。

2 个答案:

答案 0 :(得分:1)

看起来MEF无法构造IWindowManager,这是ViewModel的依赖关系。

尝试至少注册来自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);

答案 1 :(得分:1)

您可以查看Caliburn.Micro Github Samples的示例代码。

https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/samples/Caliburn.Micro.HelloMef/Caliburn.Micro.HelloMef/MefBootstrapper.cs

您需要在MEF中注册WindowManager。