1

これは私の現在の App.xaml.cs です

1 つまたは 2 つの場合は単純に見えますが、7 ~ 8 つのウィンドウがあります。これを少し一般的でより良いものにする賢い方法はありますか?

public App()
{
    _ViewModel = new MyAppViewModel();

    _ViewModel.OpenXXXWindowEvent += new EventHandler(ViewModel_OpenXXXWindow);
    _ViewModel.OpenYYYWindowEvent += new EventHandler(ViewModel_OpenYYYWindow);
    ...
}

private void ViewModel_OpenXXXWindow(object sender, EventArgs e)
{
    _XXXWindow = new XXXWindow();
    _XXXWindow.DataContext = _ViewModel;
    _XXXWindow.ShowDialog();
}

private void ViewModel_CloseXXXWindow(object sender, EventArgs e)
{
    if (_XXXWindow != null)
        _XXXWindow.Close();
}

private void ViewModel_OpenYYYWindow(object sender, EventArgs e)
{
    _YYYWindow = new YYYWindow();
    _YYYWindow.DataContext = _ViewModel;
    _YYYWindow.ShowDialog();
}

private void ViewModel_CloseYYYWindow(object sender, EventArgs e)
{
    if (_YYYWindow != null)
        _YYYWindow.Close();
}

...
4

2 に答える 2

2

XAML コード ビハインドが多すぎるということは、何らかの方法で MVVM パターンを破っていることを示しています。EventArgs を受け取る ViewModel もダメです。

ダイアログを開いたり閉じたりするには、 MVVM Lightが提供するようなメッセージング システムを使用する傾向があります。

メッセージング システム (MVVM Light を使用) を使用すると、次のようになります。

あなたのViewModelで:

private void SomeMethodThatNeedsToOpenADialog()
{
    Messenger.Default.Send(new OpenDialogXMessage());
}

そしてあなたのビューで:

Messenger.Default.Register<OpenDialogXMessage>(this, (msg) => {

    new DialogX().ShowDialog();
});

関連リンク:

于 2013-02-14T16:00:49.070 に答える
0

イベント ハンドラー ソリューションではありませんが、Bindingソリューションはどうでしょうか。Window.DialogResult残念ながら、値が設定されているときにウィンドウを閉じる原因となる をバインドすることはできません。ただし、値が設定されている場合、AttachedProperty基になるプロパティにバインドでき、バインドできないプロパティを設定できる を作成できます。見た目はこんな感じViewModelAttachedProperty

    public class AttachedProperties
    {
        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; //here the not bindable property is set and the windows is closed
        }

        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);
        }
    }

AttachedPropertyこんな風に使えます


<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:hlp="clr-namespace:AC.Frontend.Helper"
        hlp:AttachedProperties.DialogResult="{Binding DialogResult}">
  <!-- put your content here -->
</Window>

を使用して VMCommandのプロパティを設定できるようになりました。これは のです。DialogResultDataContextWindow

于 2013-02-14T16:09:18.637 に答える