我看了InteractivityQuickstart官方例子的一部分。
<prism:InteractionRequestTrigger SourceObject="{Binding ItemSelectionRequest, Mode=OneWay}">
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:ItemSelectionView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>因此,ItemSelectionRequest调用了较少参数的构造函数。
public ItemSelectionView()
{
this.DataContext = new ItemSelectionViewModel();
InitializeComponent();
}在ItemSelectionView的代码隐藏中。
问题: 1)如何能够在不使用"new“的情况下设置DataContext,因为
public ItemSelectionView(ItemSelectionViewModel model)或
[Dependency]
public ItemSelectionViewModel ViewModel
{
set { this.DataContext = value; }
}不起作用。我需要在ViewModel =>中获得一些服务,我需要这样的调用
public ItemSelectionViewModel(IEventAggregator eventAggregator)
{
_eventAggregator=eventAggregator;
}发布于 2015-10-26 14:55:34
如果您需要为弹出ViewModel提供服务,则可以使用ServiceLocator获得它。
public ItemSelectionView()
{
InitializeComponent();
DataContext = ServiceLocator.Current.GetInstance<ItemSelectionViewModel>();
}发布于 2016-10-05 14:46:48
与其像Brian建议的那样使用ServiceLocator来设置ViewModel,不如为ViewModel设置一个无参数构造函数,直接在视图类(XAML或代码背后)中设置ViewModel,并使用ViewModel本身中的ServiceLocator来获取您的ViewModel所需的服务(或它们的接口)。我建议这样做有两个原因:
所以你可以这样做:
public ItemSelectionViewModel()
{
_eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
}如果您只需要使用IEventAggregator对象一次,那么甚至没有理由将它分配给一个字段。只需在需要获取事件聚合器并完全删除显式构造函数的地方使用ServiceLocator调用即可。
https://stackoverflow.com/questions/33347646
复制相似问题