1

私はMVVMが初めてで、ダイアログを開き、その後独自のViewModel c#ファイルでダイアログを閉じる方法に問題があります。可能な解決策を検索しましたが、適切なものは見つかりませんでした。私の解決策は次のようになりますが、これに欠点があるかどうかはわかりません。UserControl を定義し、次のコマンドで開きます。

void ChangeDataPathExecute()
{
    Window window = new Window
    {
        Content = new ChangeDataRootPathUserControl(),
    };

    window.ShowDialog(); 
}

UserControl ファイルの ViewModel で次を実装します。

private void DetermineMyWindow()
{
    foreach (Window window in App.Current.Windows)
    {
        ChangeDataRootPathUserControl uc = window.Content as ChangeDataRootPathUserControl;
        if (uc == null)
            continue;

        myWindow = window;
    }

そして最後に Close メソッドで:

void OkChangeDataRootPathExecute()
{
    DetermineMyWindow();

    myWindow.Close();
}

これについてあなたはどう思いますか?ハックまたは良い解決策?フィードバックありがとうビート

4

6 に答える 6

2

MVVM シナリオのViewModelは、 について何も知る必要はありませんView。あなたの例では、ビューについて多くのことを知っている必要があるようです。

多くの人がさまざまなパターンを使用して、ViewModel からウィンドウを開閉します。私はイベント/コールバックを好みます:

class ViewModel {
    public event EventHandler ChangeDataRootPath;
}

class View : Window {
    public View() {
        InitializeComponent();

        var vm = new ViewModel();
        vm.ChangeDataRootPath += (s, e) => {
            Window window = new Window {
                Content = new ChangeDataRootPathUserControl {
                    DataContext = vm
                }
            };
            window.ShowDialog(); 
        };
        DataContext = vm;
    }
}
于 2012-05-31T16:22:58.357 に答える
1

UserControl 内から this.Parent を参照することで、より簡単にウィンドウにアクセスできます (最初のコンテンツ要素である限り)。

あなたがやろうとしていることのより正統な方法は、ウィンドウ用の新しい XAML ファイルを作成し、XAML のウィンドウ内に UserControl のインスタンスを配置することです。

UserControl で親ウィンドウを閉じることができるようにする場合は、単純な Close イベントを UserControl に追加します。Window XAML で、close イベントにイベント ハンドラーを追加し、UserControl がイベントを発生させたときに Window に Close() を呼び出させることができます。

// UserControl.cs
public event EventHandler Close;

void OkChangeDataRootPathExecute()
{
    if (Close != null)
        Close(this, EventArgs.Empty);
}


// Window.cs
void UserControl_Close(object sender, EventArgs e)
{
    Close();
}

次に、追加のオプションやスタイルを追加する場合は、SizeToContent、WindowStartupLocation、BorderStyle などの XAML に追加して、ダイアログのルック アンド フィールを制御できます。

次に、ダイアログをコードで表示したい場合は、次のように記述します。

void ChangeDataPathExecute()
{
    var window = new ChangeDataRootPathWindow();

    window.ShowDialog();
}
于 2012-05-31T16:16:08.450 に答える
0

ビューモデルはDialogServiceを開くだけです。開始点を取得するには、ここを参照してください。

于 2012-06-01T06:19:49.543 に答える
-1

MVVMを実行する場合は、MVVMフレームワークが必要になりますCaliburn.Microをお勧めします。また、そのウィンドウマネージャーをご覧ください。

于 2012-05-31T16:33:59.343 に答える