我查看了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;
}
答案 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需要的服务(或其接口)?我建议这有两个原因:
所以你可以这样做:
public ItemSelectionViewModel()
{
_eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
}
如果你只需要使用一次IEventAggregator对象,就没有理由将它分配给一个字段。只需使用ServiceLocator调用,您需要获取Event Aggregator并完全删除显式构造函数。