前提・実現したいこと
C#を勉強しており、WPFを使用してアプリケーションを作成しようと思っています。
質問なのですが、別のviewを表示しようとするときに呼び出し元で
Test tes = new Test();
tes.Show();
上記のようにやれば表示できたのですが、
MVVMだったらコードビハインドに書かないほうがいいなどの記事が多く、いまいちほかの方法について調べてもわからなかったので他にどのような方法があるのか教えてもらいたいです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ViewというのはWindow
のことですね?
ダイアログもそうなのですが、MVVMでは割と鬼門です。
「コードビハインドを書いたら負け」ぐらいの勢いの記事もたまに見ますが、(特に入門者は)そこまでこだわる必要はないと思います。
あまりに冗長になりそうな部分やよくわからない部分は、コードビハインドも使っちゃいましょう(アプリが完成しなかったら本末転倒ですし)
もちろんMVVMに慣れてきたら、挑戦してもいいでしょう。
それよりも今どきのアプリデザインは、ウィンドウやダイアログをポンポン出すような作りではなくなっています。
例えば電卓ならグラフ計算のオプションやバージョン情報等で、フライアウト(ポップアップ?)が出ます(アプリウィンドウ内に収まっているのがダイアログとの違いです)
例えばこういったものを使用すれば、似たようなものになりますしMVVMにするのも(サポートがあるので)比較的簡単です。
MahApps.Metro - Flyouts
MahApps.Metro - Input Dialog
投稿2021/12/05 09:22
総合スコア9862
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/12/05 09:32
2021/12/05 10:07
2021/12/06 01:23