Git Product home page Git Product logo

Comments (9)

runceel avatar runceel commented on August 24, 2024 2

Livet 自体には Window 内の一部を画面遷移させるみたいな機能はないので、ここで他の方に回答していただいたように何らかの仕組みを作る必要があります。

もしくは Prism を使うと、画面の一部を Region として定義して、その中を任意のユーザーコントロールに切り替える仕組みがあるので楽ですね。

ちょっと面白そうなので私も時間をとって作ってみようと思います。

from livet.

runceel avatar runceel commented on August 24, 2024

すいません。毎日チェックしてる状態ではないので返事が遅くなりました。
Livet の MessengerViewModel.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.

le-dn avatar le-dn commented on August 24, 2024

ご返事ありがとうございます。

問題の説明が不足して申し訳ありません。改めてご説明いたします。

例えば、こういう画面があります。

  • Main (Windowタイプ)
  • User (UserControlタイプ)
  • Product (UserControlタイプ)

Main画面のMainModelは以下の用で作成します。

public class MainModel: NotificationObject
{
    public object ViewModel { get; set; }
}

画面のデザインは以下のようです。

image

Main画面は2つの部分があります。上の部分はDock/StackPanelUser/Productのボタンが入ります。下の部分はContentControlMainModelobjectタイプのViewModelパラメーターにbindingします。

Userボタンを押すと、MainViewModelにあるコマンドでMainModelViewModelパラメーターをnew UserViewModel();に変更します。そして、RaisePropertyChanged("MainModel");を呼びます。

そうすると、Main画面の下のContentControl部分がUser画面の内容に変更されます。

Productボタンの方も同じパータンです。

上記のデザインと行動パターンは問題ないが、下記の方は・・・

image

例えば、User画面に「Product画面へ」というボタンがあって、このボタンを押すと、Main画面のContentControlProduct画面になります。

この行動は、少し困ります。MainModel.ViewModelを変更したいが、MainModelのインスタンスはMain画面のMainViewModelに作成されました。

だが、「Product画面へ」ボタンのコマンドはUser画面のUserViewModelに組み込んで、MainViewModelMainModelインスタンスをアクセスできません。

その理由で、UserViewModelからMainViewModelへ「"ToProductView"」メッセージを送りたいです。MainViewModelがメッセージを習得したら、MainModel.ViewModelnew ProductViewModel();に変更することができます。

ご指導のやり方は「ModelからPropertyChangedイベントやCollectionChangedイベントが発行されて、それをViewModelBで受け取り処理するといった流れ」が、上記の例にとって、MainModelインスタンスはMainViewModelに作成されたことで、UserViewModelはそのインスタンスをどうすれば習得できるのか分かりませんが・・・

from livet.

k-oshiro0322 avatar k-oshiro0322 commented on August 24, 2024

私は以下の様にして実装しましたが、他にも良い実装方法があれば知りたいです。

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.

YoshihiroIto avatar YoshihiroIto commented on August 24, 2024

@Hinotama さんこんにちは。

画面デザインだけを見てサンプルを実装してみました。
https://github.com/YoshihiroIto/WpfSample/

image

このサンプルの趣旨は教科書通りのMVVMでつくってみたら。です。
いくつかある回答の一つだと思ってください。

また、@runceel さんのおっしゃっている
「まず、前提としてアプリケーションのコアの状態やロジックなどは Model レイヤーで行います。」を実装したことになります。

作りとしては、
メインウィンド状態を扱うモデルを用意し、各ビューはそれを一方的に参照しモデルの変更をビュー観点で表現します。
複数ビューモデル間のやり取りなどは発生しする構造にはなっていません。

このサンプルが言いたいことは、
MVVMの何たるかです。モデルはビューモデルやビューに引きずられる関係になってはいけない絶対原則を守ることにより依存関係が簡素に保たれます。

繰り返しになりますが、
いくつかある回答の一つだと思ってください。

from livet.

runceel avatar runceel commented on August 24, 2024

とりあえず、どの画面がアクティブなのかとかは Model としては興味無いなら ViewModel あたりでさくっとページ切り替え出来ると楽そうなので、画面遷移用のメッセージを投げる InteractionMessenger のインスタンスを static な領域に確保して、そこにメッセージ投げると画面遷移するようにしてみました。

https://github.com/runceel/Livet-samples

wpfnav

from livet.

runceel avatar runceel commented on August 24, 2024

まぁ、いろいろなやり方があるのと、後は画面遷移を本格的にしたくてヒストリー機能が欲しい etc... とかになってくると、もしかすると汎用画面遷移部品として作りこむくらいした方が、いいケースもありえますね。

from livet.

le-dn avatar le-dn commented on August 24, 2024

@k-oshiro0322 @YoshihiroIto @runceel
ご返事ありがとうございます。

色々な方法で組み込むことができますね。
私も別のやり方でやってみたいが、今は少し他のことに集中しなければならないですが・・・
・・・といえども、皆さんのご意見は役に立ちます。

自分の質問の答えを見つけたが、他の方が質問があるかもしれないので、このイシューを閉じることは@runceelさんにお任せ致します。m(_ _;)m

お忙しいところ、ご指導いただき、ありがとうございました。m(_ _;)m

from livet.

runceel avatar runceel commented on August 24, 2024

@Hinotama
では閉じますね~。
また、何かあればお気軽に質問ください。ちょっとメールが埋もれて気づくのが遅くなることはありますが、その場合は Twitter で @Okazuki にメンションいただければ気づくのが早くなると思います。

from livet.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.