实现保存和关闭操作的 MVVM 方法是什么?

What's the MVVM way for implementing a Save&Close action?

我在应用程序中有一个设置 window,它有一个按钮,基本上是“保存并关闭”操作。

现在,视图模型知道如何保存数据,命令就在那里,并通过 Xaml 中的 {Binding ...} 链接。

为了关闭 window,我将元素本身作为命令参数传递。我在实践中并不关心它,但我想知道解决这个问题的“不错的 MVVM 方式”是什么。在这种情况下,ideal/textbook 保持 UI 行为独立的方法是什么?

关闭 window 是视图的责任,因此应该由视图中的某些东西来完成。 通过视图模型保存数据是模型的责任。 您需要的是视图中可以关闭 window 的内容。 还有一些方法可以告诉它从视图模型中关闭。 视图模型告诉视图某些更改的明显方式是绑定。

我采用的方法是从视图模型绑定一个命令。该命令进行保存,然后设置一个绑定 bool 属性。 视图绑定到此 属性 并自行关闭。 这样,viewmodel 就不需要对 window 的任何引用。 它所做的只是设置它的一个属性。

这里有一些代码可以给你一个味道。
我想你一看到它就会明白。 有一个 class 继承自没有 ui 的控件。 CloseMe 看起来像:

public class CloseMe : Control
{
    public bool? Yes
    {
        get
        {
            return (bool?)GetValue(YesProperty);
        }
        set
        {
            SetValue(YesProperty, value);
        }
    }
    public static readonly DependencyProperty YesProperty =
        DependencyProperty.Register("Yes",
                    typeof(bool?),
                    typeof(CloseMe),
                    new PropertyMetadata(null, new PropertyChangedCallback(YesChanged)));
    private static void YesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if ((bool?)e.NewValue != true)
        {
            return;
        }
        var me = (CloseMe)d;
        Window parent = Window.GetWindow(me) as Window;
        parent.Close();
    }
}

在我的 window 中:

        <local:CloseMe Yes="{Binding CloseWindow, Mode=TwoWay}"/>

CloseWindow 是我在该视图模型中提到的 bool 属性。 将其设置为 true,CloseMe 控件的 YesProperty 更改为 true。回调触发并查找其父级 window 的可视化树。然后关闭 window 并...完成。