1

メインウィンドウと、Loginwindowという別のウィンドウがあります。ある時点で、このLoginWindowが表示されてログイン情報を取得します... LoginWindowにボタンがあり、そのCommandプロパティがMainViewModelのOkCommandに次のようにバインドされています。

<Button Content = "Ok" Command="{Binding OkCommand}"/>

MainVeiwModelに、OkCommandRelayCommandを追加しました

public RelayCommand OkCommand
{
    get { return new RelayCommand(OkClose); }
}

private void OkClose()
{
    MessageBox.Show("Close Login");
}

このコードは正常に実行され、[OK]ボタンをクリックするとMessageBoxが表示されます。ただし、[OK]ボタンをクリックするとLoginWindowを閉じるにはどうすればよいですか。

4

2 に答える 2

1

非常に簡単な解決策を提案します。コマンドをバインドせず、Lo​​ginWindowコードビハインドでClickedイベントを処理するだけです。そこからウィンドウを閉じるのは本当に簡単です。

別のウィンドウのVMで[OK]ボタンを処理する別の理由はありますか?


XAML(window.xaml)の場合:

<Button Content="OK" Click="button1_Click" />

コードビハインド(window.xaml.cs):

private void button1_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}
于 2011-01-25T02:49:33.113 に答える
0

編集:

まず、MVVMスタイル

  1. イベントRequestCloseをVMに追加します。そして、OkCommandが実行されたときにこのイベントを発生させます。
  2. ダイアログを表示してVMをウィンドウにバインドする場所で、次のようにそのイベントにハンドラーを追加します。

    var window = new MyDialogWindow();

    window.DataContext = loginViewModel;

    loginViewModel.RequestClose + =(s、e)=> window.Close();

2番目の方法では、ウィンドウをCommandParameterとして渡します。

ウィンドウのNameプロパティを設定します。

<Button Content = "Ok" Command="{Binding OkCommand}" 
CommandParameter="{Binding ElementName=_windowName}"/>

または

<Button Content = "Ok" Command="{Binding OkCommand}" 
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>

そして、コマンド実行でウィンドウを閉じます。

public void Execute(object parameter)
{
    var wnd = parameter as Window;
    if (wnd!= null)
        wnd.Close();
}

参照:ボタンのプロパティIsDefaultおよびIsCancel

于 2011-01-25T02:29:47.343 に答える