7

私はMVVMが初めてで、 MVVM Light Toolkitを使用して従来のキャンセルボタンで ChildWindow を閉じる方法を見つけようとしています。

私の ChildWindow (StoreDetail.xaml) には、次のものがあります。

<Button x:Name="CancelButton" Content="Cancel" Command="{Binding CancelCommand}" />

私のViewModel(ViewModelStoreDetail.cs)には、次のものがあります。

public ICommand CancelCommand { get; private set; }

public ViewModelStoreDetail()
{
    CancelCommand = new RelayCommand(CancelEval);
}

private void CancelEval()
{
    //Not sure if Messenger is the way to go here...
    //Messenger.Default.Send<string>("ClosePostEventChildWindow", "ClosePostEventChildWindow");
}
4

8 に答える 8

1

ShowDialog()を呼び出して子ウィンドウを表示した場合は、ボタンコントロールのIsCancelプロパティを「True」に設定するだけです。

<Button Content="Cancel" IsCancel="True" />

ウィンドウのXボタンをクリックするか、キーボードのESCを押すのと同じになります。

于 2012-09-19T22:22:45.460 に答える
1
private DelegateCommand _cancelCommand;

public ICommand CancelCommand
{
    get
    {
        if (_cancelCommand == null)
            _cancelCommand = new DelegateCommand(CloseWindow);
        return _cancelCommand;
    }
}

private void CloseWindow()
{
    Application.Current.Windows[Application.Current.Windows.Count - 1].Close();
}
于 2011-07-13T04:12:43.373 に答える
0

WPF と MVVMLight を使用してからしばらく経ちましたが、メッセンジャーを使用してキャンセル イベントを送信すると思います。

于 2011-04-12T20:29:06.867 に答える
0

MVVM Light Toolkitでできる最善のことは、 を使用しMessengerView.

close メソッドをView(通常はコード ビハインド ファイルに) 登録し、必要なときにウィンドウを閉じる要求を送信するだけです。

于 2011-04-12T20:51:33.127 に答える
0

パーティーに少し遅れましたが、私は自分の意見を追加したいと思いました. user841960 の回答からの借用:

public RelayCommand CancelCommand
{
    get;
    private set;
}

それで:

SaveSettings = new RelayCommand(() => CloseWindow());

それで:

private void CloseWindow()
{
    Application.Current.Windows[Application.Current.Windows.Count - 1].Close();
}

ICommand を使用するよりも少し簡潔で、同様に機能します。

したがって、すべてを要約すると、サンプルクラスは次のようになります。

public class ChildViewModel
{
    public RelayCommand CancelCommand
    {
        get;
        private set;
    }

    public ChildViewModel()
    {
        SaveSettings = new RelayCommand(() => CloseWindow());
    }

    private void CloseWindow()
    {
        Application.Current.Windows[Application.Current.Windows.Count - 1].Close();
    }
}
于 2013-08-14T18:15:22.160 に答える
0

これを実現するためのいくつかの方法を次に示します。

  1. 子ウィンドウにメッセージを送信し、子ウィンドウの分離コードで DialogueResult を false に設定します。
  2. DialogueResult のプロパティを作成し、childwindow Dialoue CLR プロパティにバインドし、CancelCommand の CancelEval メソッドに設定します。
  3. Childwindow のオブジェクトを作成し、CancelEval で DialogueResult を false に設定します。
于 2012-09-08T16:38:59.547 に答える
0

MSDNのこの記事をご覧ください。半分ほど下に、これを行う方法に関するアプローチがあります。基本的には、を使用するWorkspaceViewModelか、公開するインターフェイスを実装してイベントを使用しますRequestClose

次に、ウィンドウの DataContext 内で (ViewModel を設定している場合)、イベントにアタッチできます。

これは記事からの抜粋です (図 7)。ニーズに合わせて調整できます。

// In App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

MainWindow window = new MainWindow();

// Create the ViewModel to which 
// the main window binds.
string path = "Data/customers.xml";
var viewModel = new MainWindowViewModel(path);

// When the ViewModel asks to be closed, 
// close the window.
viewModel.RequestClose += delegate 
{ 
    window.Close(); 
};

// Allow all controls in the window to 
// bind to the ViewModel by setting the 
// DataContext, which propagates down 
// the element tree.
window.DataContext = viewModel;

window.Show();
}
于 2011-04-12T18:09:43.743 に答える
0

NO-CODE BEHIND 機能を実装しました。それが役立つかどうかを確認してください。

編集:ここにStackoverflowの議論があります

于 2011-08-12T23:58:39.303 に答える