c# - 无法使我的 ViewModelLocator 工作

标签 c# mvvm viewmodel mef caliburn.micro

我有一个名为 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)项(每当用户单击某个按钮并在表单上执行某些操作时):

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 的 block 中:

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

带有错误消息 {"Type not found in cache: Caliburn.Micro.IWindowManager."}null 的 InnerException 消息。

最佳答案

看起来 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);

关于c# - 无法使我的 ViewModelLocator 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24139072/

相关文章:

c# - .edmx 文件是否在现实世界中使用

c# - COM 组件中的 Server.MapPath

c# - MVVM 模式中的 Viewpager

c# - MVVM DataGrid在刷新内容后如何设置焦点

c# - 我可以将 RangeSlider(来自 WPF 扩展工具包)绑定(bind)到 ObservableCollection 的日期时间属性吗?

c# - 将您的应用程序容器包含在服务的构造函数中是否被认为是糟糕的 DI 实践?

c# - Entity Framework 的快照历史

mvvm - 如何使用 Hilt (Jetpack Compose) 将 ViewModel 注入(inject)可组合函数

asp.net-mvc - 我应该使用 EF 在存储库模式中实现 DTO 吗?

asp.net-mvc - MVC 动态 View 数据和动态 View