【发布时间】:2010-12-23 15:27:16
【问题描述】:
从哪里开始?问题是关于实现同一件事的两种不同方法,而且对我来说都很有味道,所以我需要有人告诉我是否有更好的方法。因此,我们有一个在数据网格中显示数据的屏幕。当用户单击数据网格中的图标时,会显示一个模式弹出窗口(来自 Prism)。据我所知,这可以通过两种方式完成,与 SL 一起工作 2 周。 为了提供更多背景知识,我们使用 MVVM 模式,并且我们有一个 ViewModelLocator。
每行数据网格中的按钮
<Button Width="16" Name="cmdEdit" Height="16" Margin="10,0,0,0" Style="{StaticResource ImageButtonStyle}" Click="cmdEdit_Click" CommandParameter="{Binding}">
<Button.Content>
<Image Source="/Test.Application.Bid;component/Images/edit.png"/>
</Button.Content>
</Button>
第一种方式,处理来自后面代码的点击:
var p = new PopupChildWindowAction();
var vml = new ViewModelLocator();
var viewModel = vml["BidAgentEditView"] as BidAgentEditViewModel;
var view = new BidAgentEditView();
view.DataContext = viewModel;
viewModel.BidAgent = ((Button) e.OriginalSource).CommandParameter as BidAgentDto;
p.ChildWindow = view;
p.ChildWindow.Show();
第二种方法是在xaml中使用InteractionRequestTriggers,以及像这样的视图模型上的命令
数据网格中的按钮
<Button Width="16" Height="16" Margin="10,0,0,0" Style="{StaticResource ImageButtonStyle}"
prism:Click.Command="{Binding Source={StaticResource cc}, Path=DataContext.EditBidAgentCommand}"
prism:Click.CommandParameter="{Binding}">
在视图模型中
this._editBidAgentRequest = new InteractionRequest<BidAgentEditViewModel>();
EditBidAgentCommand = new DelegateCommand<BidAgentDto>(editBidAgent, canEditBidAgent);
命令处理程序
private void editBidAgent(BidAgentDto bidAgent)
{
_editBidAgentRequest.Raise(newBidAgentEditViewModel(bidAgent,_bidAgentDataService));
}
因此视图调用视图模型上的命令,该命令转身并引发交互请求,然后由视图处理并弹出子窗口。也许我不了解 MVVM,但这似乎是处理用户交互的过于复杂的方式。再加上我在视图模型上有一些叫做“交互”的东西让我觉得很脏。您认为,有没有更好的方法来做到这一点,而不必在视图模型上声明这些交互请求,完全在 xaml 中完成,而无需在视图模型中处理?
先从后面的代码来把握是怎么回事:
【问题讨论】:
标签: silverlight mvvm prism