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

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

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

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

MVVM

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

WPF

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

Q&A

解決済

3回答

4369閲覧

WPF MVVMでViewを呼び出す方法

trolling

総合スコア1

C#

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

MVVM

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

WPF

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

2グッド

0クリップ

投稿2021/12/05 05:17

前提・実現したいこと

C#を勉強しており、WPFを使用してアプリケーションを作成しようと思っています。
質問なのですが、別のviewを表示しようとするときに呼び出し元で

Test tes = new Test();
tes.Show();

上記のようにやれば表示できたのですが、
MVVMだったらコードビハインドに書かないほうがいいなどの記事が多く、いまいちほかの方法について調べてもわからなかったので他にどのような方法があるのか教えてもらいたいです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

ttact, TN8001👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

ViewというのはWindowのことですね?
ダイアログもそうなのですが、MVVMでは割と鬼門です。

「コードビハインドを書いたら負け」ぐらいの勢いの記事もたまに見ますが、(特に入門者は)そこまでこだわる必要はないと思います。

あまりに冗長になりそうな部分やよくわからない部分は、コードビハインドも使っちゃいましょう(アプリが完成しなかったら本末転倒ですし)

もちろんMVVMに慣れてきたら、挑戦してもいいでしょう。


それよりも今どきのアプリデザインは、ウィンドウやダイアログをポンポン出すような作りではなくなっています。

例えば電卓ならグラフ計算のオプションやバージョン情報等で、フライアウト(ポップアップ?)が出ます(アプリウィンドウ内に収まっているのがダイアログとの違いです)

例えばこういったものを使用すれば、似たようなものになりますしMVVMにするのも(サポートがあるので)比較的簡単です。
MahApps.Metro - Flyouts
MahApps.Metro - Input Dialog

投稿2021/12/05 09:22

TN8001

総合スコア9244

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

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

退会済みユーザー

退会済みユーザー

2021/12/05 09:32

WPF総合1位のTN8001さんのご回答も拝見できて嬉しいです。 Windows Formsの時代は別ウィンドウを表示していたりましたが、そもそもそういった設計自体が変わってきたのでしょうかね。
TN8001

2021/12/05 10:07

もちろんアプリによるとは思います。 paint.netなんかは複数ウィンドウが出ますよね(好きな位置に動かせるのがいいんでしょうね) 個人的に嫌いなのは設定ダイアログですね(適用ボタンがあればまだいいですが、OK・キャンセルだけのはほんとイヤ^^; 今どきはライブに変更がかかり、特にOKも押さずに終わるようなものがいいですね^^
trolling

2021/12/06 01:23

windows formの時は別画面でウィンドウを出したりしていたのでスが、今は1つの画面の中で切り替えたりするのですね。。 フライアウトなど初めて聞いたものばかりなので、勉強して使いこなせるようにします。。。!
guest

0

https://atmarkit.itmedia.co.jp/fdotnet/chushin/greatblogentry_02/greatblogentry_02_03.html
https://tnakamura.hatenablog.com/entry/20110218/mvvm_messenger
https://tnakamura.hatenablog.com/entry/20110221/mvvm_messenger_behavior
https://takamints.hatenablog.jp/entry/mvvm-messagebox

ごめんなさい。
誤って送信してしまいました・・
2021年も終わろうとしている現在ですが、WPFのMVVMに関しては2011年に業界をリードしていた?尾上さんのご意見が一番信頼できるような気がします。
ですが、Web業界などは技術的にブームや廃れがあった(かなり発展してきた?)にもかかわらず、WPFは2021年でもこれで良いのかと感じていたりします。

実際に業務で使おうとして、ビューモデルとモデルの連携などが簡単にできずに苦労していたります。
ネットの記事を見ても中途半端で、何がベストプラクティスなのかわからず困ったりしています。

意見交換などできたらと思っていたります。

投稿2021/12/05 08:54

編集2021/12/05 09:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

私自身C#やWPFについて勉強し始めたばかりでこれがベストな方法かはわかりませんが
サブViewをユーザーコントロールで作成し、(下記例ではSubView1とSubView2としている)
ContentControlをメインのビュー(MainWindow)の子要素として貼り付け
そのContentプロパティをDataContextで指定したViewModel内の
UserControl型のプロパティとバインドし
そのプロパティに作成したUserControl(SubView1やSubView2)を代入してやることで
一応画面遷移的な事ができます。

-下記コード例の注意-
尚下記の例ではコードを短くするため
Microsoft.Toolkit.Mvvmと呼ばれるMVVM開発補助ライブラリの
RelayCommandやObservableObjectを使用してるが
RelayCommandはDelegateCommandパターンの実装
ObservableObjectはINotyfiPropertyChangedの実装だと思ってもらって構いません。
もし何を言っているかわからない場合
本題からそれてしまいますがここにDelegateCommandやINotyfiPropertyChangedの
説明が分かりやすく書いてあります。


View側

xaml

1<Window 2 xmlns:vm="vmの名前空間" 3 ~省略~ 4> 5 <Window.DataContext> 6 <vm:MainViewModel> 7 </Window.DataContext> 8 <StackPanel> 9 <ContentControl Content="{Binding CurrentView}" /> 10 <Button Content="1" Command="{Binding To1Cmd}" /> 11 <Button Content="2" Command="{Binding To2Cmd}" /> 12 </StackPanel> 13</Window>

ViewModel側

c#

1class MainViewModel : ObservableObject 2{ 3 // 4 // 下記画面遷移関連 5 // 6 private UserControl[] _userControls = {new SubView1(), new SubView2()} //SubView1,2は自作したユーザーコントロール 7 8 // ViewのContentControl.Contentプロパティとバインドするプロパティ 9 private UserControl _currentView; 10 public UserControl CurrentView 11 { 12 get => this._currentView; 13 private set => this.SetProperty(ref this._currentView, value); 14 } 15 16 // 17 // 下記コマンド関連 18 // 19 public IRelayCommand To1Cmd { get; private set; } 20 private void To1Exe() 21 { 22 // ボタン1が表示されたらSubView1をView側のContentControlにセット 23 this.CurrentView = this._userControls[0]; 24 } 25 26 public IRelayCommand To2Cmd { get; private set; } 27 private void To2Exe() 28 { 29 // ボタン2が表示されたらSubView2をView側のContentControlにセット 30 this.CurrentView = this._userControls[1]; 31 } 32 33 // 34 // コンストラクタ 35 // 36 public MainViewModel() 37 { 38 this.To1Cmd = new RelayCommand(this.To1Exe); 39 this.To2Cmd = new RelayCommand(this.To2Exe); 40 this._currentView = this._userControls[0]; 41 } 42}

投稿2021/12/05 16:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

trolling

2021/12/06 01:19

formのように画面を別ウィンドウで出すのとは違うやり方が色々あるんですね。。 回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問