一,场景
通过单击按钮执行ViewModel中的Command来关闭窗体,项目引用Prism4架构及使用MVVM进行UI层的开发。
二, 实现代码(方式应该有很多种,现介绍两种我所想过的方式)
(1).通过发布订阅事件来关闭窗体
1.CodeBahind中的代码
1 public partial class ApproveLoginView : Window
2
3 {
4
5 [ImportingConstructor]
6
7 public ApproveLoginView()
8
9 {
10
11 InitializeComponent();
12
13 ServicesHelper.EventAggregator.GetEvent<CloseEvent> ().Subscribe(CloseView);
14
15 }
16
17 private void CloseView(object o)
18
19 {
20
21 if(o == DataContext)
22
23 Close();
24
25 }
26
27 }
2.ViewModel部分代码
1 public class ApproveLoginViewModel : NotificationObject,
2 {
3
4 private IEventAggregator _eventAggregator;
5
6 [ImportingConstructor]
7 public ApproveLoginViewModel(IEventAggregator eventAggregator)
8 {
9 _eventAggregator = eventAggregator;
10 }
11
12 #region Command
13
14 private ICommand _okCommand;
15 public ICommand OkCommand
16 {
17 get
18 {
19 if (_okCommand == null)
20 {
21 _okCommand = new RelayCommand(Ok);
22 }
23 return _okCommand;
24 }
25 private set { }
26 }
27
28
29 private void Ok()
30 {
31 _eventAggregator.GetEvent<CloseEvent>().Publish(this);
32 }
33
34
35 #endregion
36 }
(2).通过Prism的interactionRequest来实现
1.Window中的Xaml部分代码
1 <Window x:Class="MVVMCloseView.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
5 xmlns:v="http://schemas.microsoft.com/expression/2010/interactions"
6 xmlns:prism="http://www.codeplex.com/prism"
7 Title="MainWindow" Height="350" Width="525" x:Name="window">
8 <i:Interaction.Triggers>
9 <prism:InteractionRequestTrigger SourceObject="{Binding CloseRequest}">
10 <v:CallMethodAction MethodName="Close" TargetObject="{Binding ElementName=window}"/>
11 </prism:InteractionRequestTrigger>
12 </i:Interaction.Triggers>
13 <Grid>
14 <Button Content="Close" Grid.Row="1" FontSize="30" Width="200" Height="100" Command="{Binding CloseCommand}"/>
15 </Grid>
16 </Window>
2.ViewModel中的部分代码
1 public class MainWindowViewModel : NotificationObject
2 {
3 public MainWindowViewModel()
4 {
5 this.CloseCommand = new DelegateCommand(new Action(Close));
6 this.CloseRequest = new InteractionRequest<Notification>();
7 }
8
9 public DelegateCommand CloseCommand { get; set; }
10
11 private void Close()
12 {
13 this.CloseRequest.Raise(new Notification() );
14 }
15
16 public InteractionRequest<Notification> CloseRequest { get; set; }
17 }
好了,就说到这了,因为自己在通过ViewModel来关闭view碰到些问题,上网找了些资料后找到这些解决方法的,希望对有需要的朋友能有帮助。