从哪里开始?问题是两种不同的方式来实现同样的事情,这两种方式对我来说都是闻到的,所以我需要有人告诉我是否有更好的方法。因此,我们有一个显示数据网格数据的屏幕。当用户单击数据网格中的图标时,将显示模式弹出窗口(来自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}">
在viewmodel ctor中
this._editBidAgentRequest = new InteractionRequest<BidAgentEditViewModel>();
EditBidAgentCommand = new DelegateCommand<BidAgentDto>(editBidAgent, canEditBidAgent);
和命令处理程序
private void editBidAgent(BidAgentDto bidAgent)
{
_editBidAgentRequest.Raise(newBidAgentEditViewModel(bidAgent,_bidAgentDataService));
}
因此,视图调用视图模型上的命令,该命令转向并引发由视图处理的交互请求,并弹出子窗口。也许我不了解MVVM,但这似乎是处理用户交互的过于复杂的方式。再加上我在视图模型上有一些“交互”的事实让我觉得很脏。你怎么想,有没有更好的方法来做到这一点,而不必在视图模型上声明这些交互请求,这是完全在xaml中完成的,而不必在视图模型中处理这个?
首先从代码中了解正在发生的事情:
答案 0 :(得分:3)
正如您可能知道的那样,Prism proposes interaction requests就是这种情况。请记住,VM必须处理视图的业务逻辑部分。在执行操作时显示弹出窗口的顺序是VM职责的一部分。
此外,您可以保持View清洁,没有任何代码隐藏(否则几乎不可测试),而且您正在利用Silverlight的优势。
总结一下,交互请求对我来说非常简洁。