質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

19531閲覧

【WPF】ボタンを押すとメインウィンドウを非表示にして別ウィンドウを表示させたい【MVVM】

aridai1221

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2017/01/08 02:46

###前提・実現したいこと
WPFアプリケーションでメインウィンドウに配置されているボタンを押すと、そのメインウィンドウが閉じて、別のウィンドウを表示させるようにしたいです。

###発生している問題
ボタンが押されたときの処理を書くためにMainWindowViewModelにコマンドを作り、そのコマンドでメインウィンドウのHideメソッドを呼び、別のウィンドウを生成し、showメソッドで表示させ、別ウィンドウが閉じられたときにまたメインウィンドウをShowメソッドで表示させるという処理をさせようと考えましたが、この方法を取ろうとすると、MainWindowViewModelがメインウィンドウの参照を持っている必要があるので、MVVMパターンを意識した設計をする上ではよろしくないと思い、どこにどのようにコードを書くのがよりよいのかを悩んでいます。

###補足情報(言語/FW/ツール等のバージョンなど)
PrismとReactivePropertyを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ViewModelを起点にViewを操作する方法としては、添付ビヘイビアやメッセンジャーなどの方法があります。
また、Prismを使っているのであればInteractionRequestの機能が用意されているので、これを使うのも良いかと思います。

InteractionRequestを利用するサンプルを載せておきます。
System.Windows.Interactivityを参照に追加してください。

MainWindow.xaml

xml

1<Window x:Class="TeraTail61250.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 7 xmlns:p="http://www.codeplex.com/prism" 8 xmlns:local="clr-namespace:TeraTail61250" 9 mc:Ignorable="d" 10 Title="MainWindow" Height="350" Width="525"> 11 <!--↑ local はViewModelやActionクラスの名前空間に置き換えてください--> 12 13 <Window.DataContext> 14 <local:MainWindowViewModel /> 15 </Window.DataContext> 16 17 <i:Interaction.Triggers> 18 <p:InteractionRequestTrigger SourceObject="{Binding ShowAnotherWindowRequest}"> 19 <local:ShowAnotherWindowAction /> 20 </p:InteractionRequestTrigger> 21 </i:Interaction.Triggers> 22 23 <Grid> 24 <Button Width="75" Height="30" Command="{Binding ShowAnotherWindowCommand}"/> 25 </Grid> 26</Window>

MainWindowViewModel.cs

C#

1public class MainWindowViewModel : BindableBase 2{ 3 //トリガになるボタンのコマンド 4 public ICommand ShowAnotherWindowCommand { get; private set; } 5 6 //ViewのInteractionRequestTriggerからバインドするプロパティ 7 public InteractionRequest<Notification> ShowAnotherWindowRequest { get; private set; } 8 9 public MainWindowViewModel() 10 { 11 this.ShowAnotherWindowCommand = new DelegateCommand(showAnotherWindow); 12 this.ShowAnotherWindowRequest = new InteractionRequest<Notification>(); 13 } 14 15 //コマンドの実行内容 16 private void showAnotherWindow() 17 { 18 //別ウィンドウのDataContextに使うオブジェクト 19 var vm = new AnotherWindowViewModel(); 20 21 //requestのRaiseを呼び出す 22 ShowAnotherWindowRequest.Raise(new Notification { Content = vm }); 23 } 24}

ShowAnotherWindowAction.cs

C#

1public class ShowAnotherWindowAction : TriggerAction<DependencyObject> 2{ 3 protected override void Invoke(object parameter) 4 { 5 var args = parameter as InteractionRequestedEventArgs; 6 var vm = args.Context.Content; 7 var callerWindow = this.AssociatedObject as Window; 8 9 //親ウィンドウ非表示 10 callerWindow.Hide(); 11 12 //別ウィンドウを生成、表示 13 new AnotherWindow() { DataContext = vm }.ShowDialog(); 14 15 //親ウィンドウ再表示 16 callerWindow.Show(); 17 18 //呼び出しが終わったことを伝えるコールバック 19 args.Callback.Invoke(); 20 } 21}

投稿2017/01/09 03:17

oika

総合スコア425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aridai1221

2017/01/09 12:09

ありがとうございます。 とても分かりやすい説明で助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問