一,场景
通过单击按钮执行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碰到些问题,上网找了些资料后找到这些解决方法的,希望对有需要的朋友能有帮助。