以ieventagrrregator作为参数的ViewModel构造函数



在我的应用程序中,我通常使用viewModel构造函数,而没有任何参数,并从xaml中找到我的ViewModel,如下所示。

<UserControl.Resources>
    <ResourceDictionary>
        <vm:TabViewModel  x:Key ="vm" ></vm:TabViewModel>
    </ResourceDictionary>
</UserControl.Resources>

通过使用此功能,我可以在XAML中的设计时间轻松地引用我的ViewModel属性。

<Grid x:Name="grid" DataContext="{Binding Source={StaticResource ResourceKey=vm}}">

但是,由于我将在两个ViewModels之间进行通信,因此我开始使用 Prism 6 (事件聚合器(。

public TabViewModel(IEventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        tabPoco = new TabWindowPoco();
        tabPoco.Tag = "tag";
        tabPoco.Title = "Title";
        tabPoco.ListDataList = new ObservableCollection<ListData>();
        tabPoco.ListDataList.Add(new ListData() { Name = "First", Age = 10, Country = "Belgium" });
        tabPoco.ListDataList.Add(new ListData() { Name = "Second", Age = 11, Country = "USA" });
        tabPoco.ListDataList.Add(new ListData() { Name = "Third", Age = 12, Country = "France" });
    }

我正在使用 Bootstrapper 加载应用程序。

由于我正在使用ieventaggregator,因此我强迫使用Prism:viewModellocator.autowireviewModel =" true"来定位ViewModel。否则,应用程序将不运行。现在,我无法将ViewModel用作资源,也无法将其连接到DataContext。

我不希望Prism自动找到各自的ViewModel,我想控制它。我想在XAML中找到它,并将其分配给DataContext。

有人知道我该如何实现吗?

这看起来您未能设置依赖项注入容器。依赖注入使用接口类型和混凝土类型之间的预设映射。您的映射看起来与此相似(Prism/Entlib 5示例(:

public class Bootstrapper : UnityBootstrapper
{
    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();
        this.Container.RegisterType<IMyViewModel, SomeViewModel>();
        this.Container.RegisterType<IFooViewModel, SomeOtherViewModel>();
    }
}

稍后打电话:

this.DataContext = container.Resolve<IMyViewModel>();

这比这个小示例所建议的要强大 - 您可以从容器(或区域管理器(中启动视图,并最终自动解决其所有依赖项。

要在XAML中维护IntelliSense等,您可以在XAML中指定ViewModel的类型

<UserControl x:Class="YourNamespace.YourFancyView"
             ...
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:myNamespaceAlias="clr-namespace:PathToMyViewModelsInterface" 
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="100"
             d:DataContext="{d:DesignInstance myNamespaceAlias:IMyViewModel, IsDesignTimeCreatable=False}" 
             ...
             >
</UserControl>

检查相关的问题如何指定datacontext(viewModel(键入以在XAML编辑器中获取设计时绑定检查,而无需创建viewModel对象?使用Design Time Databinding ner n时为更多信息开发WPF用户控制

相关内容

  • 没有找到相关文章

最新更新