Comments (9)
Livet 自体には Window 内の一部を画面遷移させるみたいな機能はないので、ここで他の方に回答していただいたように何らかの仕組みを作る必要があります。
もしくは Prism を使うと、画面の一部を Region として定義して、その中を任意のユーザーコントロールに切り替える仕組みがあるので楽ですね。
ちょっと面白そうなので私も時間をとって作ってみようと思います。
from livet.
すいません。毎日チェックしてる状態ではないので返事が遅くなりました。
Livet の Messenger
は ViewModel.cs
で定義されているように ViewModel
ごとにインスタンスが異なります。
https://github.com/runceel/Livet/blob/master/Livet.Shared/ViewModel.cs
主な用途は、ViewModel レイヤーから View レイヤーへのメッセージの送信を想定しています。
使おうと思えば InteractionMessenger クラスのインスタンスをシングルトンで管理して、メッセージの受け取り側で MessageListener
クラスを使ってメッセージの受信を行うこともできますが、あまり想定された使い方のようには思えません。(MessageListener クラスにドキュメントコメントがないため外部での利用は、あまり意図されていないと思います)
Livet でどうするべきか
まず、前提としてアプリケーションのコアの状態やロジックなどは Model
レイヤーで行います。
そうしておくと ViewModelA
で何かをして Model
が更新されると、Model
から PropertyChanged
イベントや CollectionChanged
イベントが発行されて、それを ViewModelB
で受け取り処理するといった流れになると思います。
from livet.
ご返事ありがとうございます。
問題の説明が不足して申し訳ありません。改めてご説明いたします。
例えば、こういう画面があります。
Main
(Windowタイプ)User
(UserControlタイプ)Product
(UserControlタイプ)
Main
画面のMainModel
は以下の用で作成します。
public class MainModel: NotificationObject
{
public object ViewModel { get; set; }
}
画面のデザインは以下のようです。
Main
画面は2つの部分があります。上の部分はDock/StackPanel
でUser/Product
のボタンが入ります。下の部分はContentControl
でMainModel
のobject
タイプのViewModel
パラメーターにbinding
します。
User
ボタンを押すと、MainViewModel
にあるコマンドでMainModel
のViewModel
パラメーターをnew UserViewModel();
に変更します。そして、RaisePropertyChanged("MainModel");
を呼びます。
そうすると、Main
画面の下のContentControl
部分がUser
画面の内容に変更されます。
Product
ボタンの方も同じパータンです。
上記のデザインと行動パターンは問題ないが、下記の方は・・・
例えば、User
画面に「Product画面へ
」というボタンがあって、このボタンを押すと、Main
画面のContentControl
がProduct
画面になります。
この行動は、少し困ります。MainModel.ViewModel
を変更したいが、MainModel
のインスタンスはMain
画面のMainViewModel
に作成されました。
だが、「Product画面へ
」ボタンのコマンドはUser
画面のUserViewModel
に組み込んで、MainViewModel
のMainModel
インスタンスをアクセスできません。
その理由で、UserViewModel
からMainViewModel
へ「"ToProductView"」メッセージを送りたいです。MainViewModel
がメッセージを習得したら、MainModel.ViewModel
をnew ProductViewModel();
に変更することができます。
ご指導のやり方は「Model
からPropertyChanged
イベントやCollectionChanged
イベントが発行されて、それをViewModelB
で受け取り処理するといった流れ」が、上記の例にとって、MainModel
インスタンスはMainViewModel
に作成されたことで、UserViewModel
はそのインスタンスをどうすれば習得できるのか分かりませんが・・・
from livet.
私は以下の様にして実装しましたが、他にも良い実装方法があれば知りたいです。
UserViewModelからUserViewに対してメッセンジャーで通知します。
Messenger.Raise(new InteractionMessage("UserViewModel"));
<l:InteractionMessageTrigger Messenger="{Binding Messenger}" MessageKey="UserViewModel">
<local:MainViewModelSampleAction />
</l:InteractionMessageTrigger>
ActionにてUserControlより親のコントロールを探し、そのDataContextを取得するとMainViewModelにアクセス出来ます。
親のWindowを探す方法は割愛します。
public class MainViewModelSampleAction : TriggerAction<FrameworkElement> {
protected override void Invoke(object parameter) {
//Windowオブジェクトを探す
var window = CustomHelper.FindParent<Window>(this.AssociatedObject);
if (window == null) {
return;
}
var vm = window.DataContext as MainViewModel;
if (vm != null) {
//vmのメソッドを呼び出す
}
}
}
from livet.
@Hinotama さんこんにちは。
画面デザインだけを見てサンプルを実装してみました。
https://github.com/YoshihiroIto/WpfSample/
このサンプルの趣旨は教科書通りのMVVMでつくってみたら。です。
いくつかある回答の一つだと思ってください。
また、@runceel さんのおっしゃっている
「まず、前提としてアプリケーションのコアの状態やロジックなどは Model レイヤーで行います。」を実装したことになります。
作りとしては、
メインウィンド状態を扱うモデルを用意し、各ビューはそれを一方的に参照しモデルの変更をビュー観点で表現します。
複数ビューモデル間のやり取りなどは発生しする構造にはなっていません。
このサンプルが言いたいことは、
MVVMの何たるかです。モデルはビューモデルやビューに引きずられる関係になってはいけない絶対原則を守ることにより依存関係が簡素に保たれます。
繰り返しになりますが、
いくつかある回答の一つだと思ってください。
from livet.
とりあえず、どの画面がアクティブなのかとかは Model としては興味無いなら ViewModel あたりでさくっとページ切り替え出来ると楽そうなので、画面遷移用のメッセージを投げる InteractionMessenger
のインスタンスを static な領域に確保して、そこにメッセージ投げると画面遷移するようにしてみました。
https://github.com/runceel/Livet-samples
from livet.
まぁ、いろいろなやり方があるのと、後は画面遷移を本格的にしたくてヒストリー機能が欲しい etc... とかになってくると、もしかすると汎用画面遷移部品として作りこむくらいした方が、いいケースもありえますね。
from livet.
@k-oshiro0322 @YoshihiroIto @runceel
ご返事ありがとうございます。
色々な方法で組み込むことができますね。
私も別のやり方でやってみたいが、今は少し他のことに集中しなければならないですが・・・
・・・といえども、皆さんのご意見は役に立ちます。
自分の質問の答えを見つけたが、他の方が質問があるかもしれないので、このイシューを閉じることは@runceelさんにお任せ致します。m(_ _;)m
お忙しいところ、ご指導いただき、ありがとうございました。m(_ _;)m
from livet.
@Hinotama
では閉じますね~。
また、何かあればお気軽に質問ください。ちょっとメールが埋もれて気づくのが遅くなることはありますが、その場合は Twitter で @Okazuki にメンションいただければ気づくのが早くなると思います。
from livet.
Related Issues (20)
- nugetで2.1.0をインストールするときのエラー HOT 9
- 新しい Behavior ライブラリへの更新 HOT 7
- don't have English version readme HOT 2
- DispatcherCollection.Dispatcherはnull許容ですか? HOT 1
- README.mdの画像リンク切れ HOT 3
- Nuget ライブラリの更新 HOT 2
- DataGridHyperlinkColumnのEventTrigger HOT 4
- Latest version Livet throws error on WPF. HOT 3
- .NET Framework のプロジェクトテンプレートが空のプロジェクトを生成する
- VisualStudio2019にて新規プロジェクトでLivetテンプレートを使用するとClickOnce発行ができません。 HOT 4
- CursorTypeAndBooleanConverter is not working HOT 4
- GitHub Actions 上での単体テストが常に失敗する
- FolderSelectionMessage cause FileNotFoundException in ver 3.2.3. HOT 4
- FolderSelectionMessageでの複数選択 HOT 3
- Working for .NET 6 and Visual Studio 2022
- FolderSelectionMessage cause InvalidOperationException in ver 3.2.3.2 HOT 4
- .NET 6 で FolderBrowserDialog を開こうとするとエラー HOT 3
- FolderSelectionMessage.Response の型 HOT 2
- 本家DataTriggerが初期値に対応しました
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from livet.