Prism5 PopupWindowAction和注入

时间:2015-10-26 14:00:54

标签: wpf unity-container prism

我查看了InteractivityQuickstart官方示例的一部分。

<prism:InteractionRequestTrigger SourceObject="{Binding ItemSelectionRequest, Mode=OneWay}">
        <prism:PopupWindowAction>
            <prism:PopupWindowAction.WindowContent>
                <views:ItemSelectionView />
            </prism:PopupWindowAction.WindowContent>
        </prism:PopupWindowAction>
    </prism:InteractionRequestTrigger>

因此,ItemSelectionRequest调用less-parametre构造函数

public ItemSelectionView()
{
    this.DataContext = new ItemSelectionViewModel();
    InitializeComponent();
}

在ItemSelectionView的代码隐藏中。

问题: 1)如何设置DataContext而不使用&#34; new&#34;,因为

public ItemSelectionView(ItemSelectionViewModel model)

[Dependency]
public ItemSelectionViewModel ViewModel
{
    set { this.DataContext = value; }
}

不起作用。 我需要在ViewModel =&gt;中获得一些服务我需要打电话给这样的事情

public ItemSelectionViewModel(IEventAggregator eventAggregator)
{
    _eventAggregator=eventAggregator;
}

2 个答案:

答案 0 :(得分:2)

如果您需要为Popup ViewModel提供服务,可以使用ServiceLocator获取它。

public ItemSelectionView()
{
    InitializeComponent();
    DataContext = ServiceLocator.Current.GetInstance<ItemSelectionViewModel>();
}

答案 1 :(得分:0)

不要像使用Brian Lagunas那样使用ServiceLocator设置ViewModel,为什么不为ViewModel设置无参数构造函数,直接在View类(XAML或代码隐藏)中设置ViewModel,并在ViewModel本身中使用ServiceLocator获取ViewModel需要的服务(或其接口)?我建议这有两个原因:

  • 在弹出窗口的构造函数中使用ServiceLocator会给出错误&#34;必须设置ServiceLocationProvider&#34;在设计时间内&#34; prism:PopupWindowAction.WindowContent&#34;部分。 (虽然它在运行时工作正常。)
  • 您已经被迫进入必须以某种方式绕过依赖注入的情况,所以为什么不简化代码,特别是如果您只需要访问一个服务。

所以你可以这样做:

public ItemSelectionViewModel()
{
    _eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
}

如果你只需要使用一次IEventAggregator对象,就没有理由将它分配给一个字段。只需使用ServiceLocator调用,您需要获取Event Aggregator并完全删除显式构造函数。