MVVM窗口/控制操作

Are*_*ren 2 .net wpf mvvm

我正在构建一个WPF MVVM应用程序,我想保留我能够符合MVVM的东西(我知道有些东西是过度工程,尽管这里尽力而为).

我遇到了一个小小的dillema,我需要根据视图模型中的方法中的一些逻辑隐藏/关闭一个窗口.

我无法为我的生活想出一个可靠的方法来做到这一点.我已经将一个Visibility属性绑定到窗口的Visibility DP,它可以工作(sorta)但是我如何调用Close()对话框?

我正在使用View-First MVVM,因此视图模型不了解视图,视图实例化视图模型(通过DI/IoC)并将其设置为DataContext.

命令以错误的方式工作,事件是不可能的,除非我在代码后面绑定它是id而不是如果有一个MVVM方法来完成它并不完全复杂.

来自更大的SO社区的任何想法?

或者也许我一般都缺少一些关于MVVM的东西?无论哪种方式,让我知道:o

Jay*_*Jay 5

通常情况下,有很多方法可以为这只猫提供皮肤.

在视图中没有代码隐藏的情况下执行此操作的一种方法是使用附加行为,例如:

public static class CloseBehavior 
{
    public static bool GetCloseWhen(DependencyObject obj)
    {
        return (bool)obj.GetValue(CloseWhenProperty);
    }

    public static void SetCloseWhen(DependencyObject obj, bool value)
    {
        obj.SetValue(CloseWhenProperty, value);
    }

    public static readonly DependencyProperty CloseWhenProperty =
        DependencyProperty.RegisterAttached(
            "CloseWhen", typeof(bool), typeof(CloseBehavior), 
            new UIPropertyMetadata(OnCloseWhenChanged));
    // the lone parameter in the UIPropertyMetadata is a callback
    // for when the property value changes

    static void OnCloseWhenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // if false, we're not concerned with it
        if(!(bool)e.NewValue) return;

       // if attached to something other than a window, this doesn't make sense
        var win = d as Window;

        if(d == null) return;

            // close the window
        win.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的XAML中:

<Window x:Class="WpfApplication1.Window1"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 

     local:CloseBehavior.CloseWhen="{Binding ViewModelWorkComplete}"
>
<! -- content -->
</Window>
Run Code Online (Sandbox Code Playgroud)

其中ViewModelWorkComplete只是视图模型中的布尔属性.

结果是当viewmodel设置ViewModelWorkCompletetrue(并引发相应的INotifyPropertyChanged事件)时,窗口将被关闭.