5

さまざまな UserControl をページとしてホストするウィンドウがあります。ユーザーコントロールのデータコンテキスト内から参照していないウィンドウを閉じることはできますか? 簡略化された詳細:

セットアップウィンドウ

    public SetupWindow()
    {
        InitializeComponent();
        Switcher.SetupWindow = this;
        Switcher.Switch(new SetupStart());  
    }

    public void Navigate(UserControl nextPage)
    {
        this.Content = nextPage;
    }

SetupStart UserControl

<UserControl x:Class="...">
 <UserControl.DataContext>
    <local:SetupStartViewModel/>
 </UserControl.DataContext>
 <Grid>
    <Button Content="Continue" Command="{Binding ContinueCommand}"/>
 </Grid>
</UserControl>

SetupStartViewModel のセットアップ

    public SetupStartViewModel()
    {
    }

    private bool canContinueCommandExecute() { return true; }

    private void continueCommandExectue()
    {
        Switcher.Switch(new SetupFinish());
    }

    public ICommand ContinueCommand
    {
        get { return new RelayCommand(continueCommandExectue, canContinueCommandExecute); }
    }
4

3 に答える 3

6

私はここで答えから解決策を見つけることができました: How to bind Close command to a button

ビューモデル:

public ICommand CloseCommand
{
    get { return new RelayCommand<object>((o) => ((Window)o).Close(), (o) => true); }
}

意見:

<Button Command="{Binding CloseCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Content="Close"/>
于 2012-07-09T13:30:38.727 に答える
5

これを行うにRequestCloseは、ViewModelにイベントを設定して、ビューを閉じたいときに発生させることができます。

Close()次に、これは、ウィンドウを作成するコードによってウィンドウのコマンドに接続されます。例えば

var window    = new Window();
var viewModel = new MyViewModel();

window.Content = viewModel;
viewModel.RequestClose += window.Close;

window.Show()

このようにして、ウィンドウの作成に関連するすべての作業が1か所で処理されます。ビューもビューモデルもウィンドウについて知りません。

于 2012-06-15T10:00:44.273 に答える
3

ユーザー コントロール内では、Window クラスの静的メソッドを使用してホストしているウィンドウへの参照を見つけることができます。

var targetWindow = Window.GetWindow(this);
targetWindow.Close();

編集:

データ コンテキストが使用されているユーザー コントロールへの参照がない場合、膨大な量のオプションはありません。アプリケーション ウィンドウが 1 つしかない場合は、回避できます。

Application.Current.MainWindow.Close()

アプリケーションに多くのウィンドウがあり、閉じたいウィンドウがフォーカスされている場合、次のようなものでそれを見つけることができます

public Window GetFocusWindow()
{
    Window results = null;
    for (int i = 0; i < Application.Current.Windows.Count; i ++)
        if (Application.Current.Windows[i].IsFocused)
        {
            results = Application.Current.Windows[i];
            break;
        }
    return results;
}

最後に、アプリケーション ウィンドウ クラスをループして、目的の参照が見つかるまでビジュアル ツリー内のすべてのオブジェクトのデータ コンテキストをチェックし、そこからウィンドウを閉じることができると思います。

于 2012-06-15T09:33:28.587 に答える