0

最近、私はMVVMソリューションだと思っていたウィンドウの閉じるボタンXボタンにバインドする方法という質問に答えました。そこにある実際の質問に集中しないでください。それは私を悩ませているものではないからです。その特定のケースでは、そこで私のソリューションを使用することさえしません。私は間違いなく@ChrisWのソリューションを使用します。

その後、@SpikeX からの応答が表示され、今は混乱しています。しかし、私は彼に感謝しなければなりません。今までMVVMについて間違った考えを持っていたので、私はそれについて考えるのをやめることはできません.

だから私は研究を始めました:

ViewModel からウィンドウを閉じる

MVVM の基本概念 — ViewModel は何をすべきか?

等々...

ご覧のとおり、 からウィンドウを閉じたのは宇宙で私だけではありませんViewModel。しかし、私は本当にそれを行うことができますか? それとも、 で window を使用してはならないというのは本当ですかViewModel。MVVMはこれについて本当に厳格ですか? 本当に私のソリューションは MVVM パターンを壊していますか?

4

2 に答える 2

1

はい、あなたの解決策はパターンを破っています。最大の欠点は、VM とロジックを完全にテストできないことです。これにより、ウィンドウを閉じるのが妨げられます。しかし、いつものように、回避策を実装する価値があるかどうかを検討する必要があります。

したがって、本当にMVVMに固執したい場合は、最初にリンクされたSO投稿に投稿したソリューションを使用できます。ここに私の投稿の重要な部分をコピーしました。

見積もり

<Window x:Class="AC.Frontend.Controls.DialogControl.Dialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:DialogControl="clr-namespace:AC.Frontend.Controls.DialogControl" 
        xmlns:hlp="clr-namespace:AC.Frontend.Helper"
        MinHeight="150" MinWidth="300" ResizeMode="NoResize" SizeToContent="WidthAndHeight"
        WindowStartupLocation="CenterScreen" Title="{Binding Title}"
        hlp:AttachedProperties.DialogResult="{Binding DialogResult}" WindowStyle="ToolWindow" ShowInTaskbar="True"
        Language="{Binding UiCulture, Source={StaticResource Strings}}">
        <!-- A lot more stuff here -->
</Window>

ご覧のとおり、xmlns:hlp="clr-namespace:AC.Frontend.Helper"最初に名前空間を宣言し、その後で binding を宣言していますhlp:AttachedProperties.DialogResult="{Binding DialogResult}"

[...]

public class AttachedProperties
{
    #region DialogResult

    public static readonly DependencyProperty DialogResultProperty =
        DependencyProperty.RegisterAttached("DialogResult", typeof (bool?), typeof (AttachedProperties), new PropertyMetadata(default(bool?), OnDialogResultChanged));

    private static void OnDialogResultChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var wnd = d as Window;
        if (wnd == null)
            return;

        wnd.DialogResult = (bool?) e.NewValue;
    }

    public static bool? GetDialogResult(DependencyObject dp)
    {
        if (dp == null) throw new ArgumentNullException("dp");

        return (bool?)dp.GetValue(DialogResultProperty);
    }

    public static void SetDialogResult(DependencyObject dp, object value)
    {
        if (dp == null) throw new ArgumentNullException("dp");

        dp.SetValue(DialogResultProperty, value);
    }

    #endregion
}

/見積もり

VM私のソリューションを機能させるために必要なのは、このようなものだけです。

public class WindowVm : ViewModelBase // base class implementing INotifyPropertyChanged
{
    private bool? _dialogResult;
    public bool? DialogResult
    {
        get { return _dialogResult; }
        set 
        {
             _dialogResult = value;
             RaisePropertyChanged(() => DialogResult);
        }
    }

    //... many other properties
}
于 2013-05-24T07:51:38.357 に答える