ViewModel负责并在Silverlight中弹出子窗口

时间:2010-12-23 15:27:16

标签: silverlight mvvm prism

从哪里开始?问题是两种不同的方式来实现同样的事情,这两种方式对我来说都是闻到的,所以我需要有人告诉我是否有更好的方法。因此,我们有一个显示数据网格数据的屏幕。当用户单击数据网格中的图标时,将显示模式弹出窗口(来自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中完成的,而不必在视图模型中处理这个?

首先从代码中了解正在发生的事情:

1 个答案:

答案 0 :(得分:3)

正如您可能知道的那样,Prism proposes interaction requests就是这种情况。请记住,VM必须处理视图的业务逻辑部分。在执行操作时显示弹出窗口的顺序是VM职责的一部分。

此外,您可以保持View清洁,没有任何代码隐藏(否则几乎不可测试),而且您正在利用Silverlight的优势。

总结一下,交互请求对我来说非常简洁。