如何从 mvvm 中的视图模型关闭视图?

Posted

技术标签:

【中文标题】如何从 mvvm 中的视图模型关闭视图?【英文标题】:How can i close a view from view model in mvvm? 【发布时间】:2017-08-17 21:51:34 【问题描述】:

我正在使用带有 MVVM 模式的 WPF。我想从 viewmodel 关闭一个窗口。我尝试使用以前的一些问题的解决方案,但它不起作用。

这是我的代码:

视图模型:

//Defining commands    
public RelayCommand SaveAddBankCommand  get; private set; 

//Constructor
        public AddBankVM()
        
            //Initializing Commands
            SaveAddBankCommand = new RelayCommand(SaveAddBank); 
        

//Commands methods
        public void SaveAddBank(object parameter)
        
            new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes);
            new Done("Bank has been added successfully.");

            //here i want to close the window.

        

查看类:

public partial class AddBankView : Window
    
        public AddBankView()
        
            InitializeComponent();
            var addBankVM = new AddBankVM();
            this.DataContext = addBankVM;
        

【问题讨论】:

有很多方法可以做到这一点。您需要提供一些代码来向我们展示您为什么要这样做。然后我们可以帮助您。 我已经编辑了这个问题。你可以看看我的代码。 您的 ViewModel 中确实有一个窗口实例,对,所以只需 yourWindow.Close(); 【参考方案1】:

好的。这是一种方法:

在视图模型中...

    //Commands methods
    public void SaveAddBank()
    
        new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes);
        new Done("Bank has been added successfully.");

        //here i want to close the window.
        CloseWindowEvent?.Invoke(this, EventArgs.Empty);
    
    public event EventHandler CloseWindowEvent;

在初始化后面的代码中...

        InitializeComponent();
        DataContext = new AddBankVM();
        (DataContext as AddBankVM).CloseWindowEvent += CommandBench_CloseWindowEvent;

最后是后面代码中的事件处理程序……

    private void CommandBench_CloseWindowEvent(object sender, EventArgs e)
    
        Close();
    

从概念上讲,正在发生的事情是视图模型正在向窗口发送事件以关闭自身。

我怀疑 MVVM 风格的警察在使用这种方法时会遇到一些问题。让我们看看我们是否收到他们的消息。

【讨论】:

【参考方案2】:

最简单的方法是引入接口:

public interface IClosable

    void Close();

然后,您需要在代码隐藏中更改的唯一一件事就是指定窗口实现IClosable

public partial class MainWindow : Window, IClosable

    public MainWindow()
    
        InitializeComponent();
    

XAML:

    <Button Width="50"
            Height="20"
            Command="Binding CloseCommand"
            CommandParameter="Binding RelativeSource=RelativeSource FindAncestor,
                                                                      AncestorType=x:Type Window"
            Content="Close" />

视图模型:

    #region Commands
    public DelegateCommand<IClosable> CloseCommand => new DelegateCommand<IClosable>(Close, CanClose);

    private bool CanClose(IClosable parameter)
    
        return true;
    
    private void Close(IClosable parameter)
    
        var closable = parameter as IClosable;
        if (closable != null)
        
            closable.Close();
        
    

或者,您可以使用 EventTigger、行为或附加行为,但恕我直言,它不那么简单。

【讨论】:

【参考方案3】:

在此链接中,您将找到从视图模型打开和关闭对话框的出色机制。 https://www.youtube.com/watch?v=OqKaV4d4PXg

【讨论】:

以上是关于如何从 mvvm 中的视图模型关闭视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MVVM 灯光从 CustomControl 引用视图模型

WPF(MVVM):从 Viewmodel 关闭视图?

iOS:如何使用 MVVM 将模型从视图模型传递到视图模型?

是否可以使用 MVVM 从视图修改视图模型中的属性? [复制]

如何在 viewmodel 中访问 mvvm 模型中的控件?

视图模型应该对视图控制器中的事件做出反应吗?