【问题标题】:Cannot make my ViewModelLocator work无法使我的 ViewModelLocator 工作
【发布时间】:2014-07-31 02:27:55
【问题描述】:

我有一个名为 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();
            }
        }
}

现在我有一个我正在构建的 UserControl,其中包含一个 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>();
            }
        }

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

【问题讨论】:

    标签: c# mvvm viewmodel mef caliburn.micro


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

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

      您需要在 MEF 中注册您的 WindowManager。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多