【问题标题】:How can i close a view from view model in mvvm?如何从 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();

标签: c# wpf mvvm view viewmodel


【解决方案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

      【讨论】:

        猜你喜欢
        • 2018-08-02
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        相关资源
        最近更新 更多