Open18

WPFに再度挑戦

tkoba2tkoba2

WPFを勉強する過程で出会ったキーワードたち

  1. XAML
  2. MVVM
  3. MVVM Framework
  4. Prism
  5. ReactiveProperty
  6. CommunityToolkit.Mvvm
  7. Binding
  8. Command
  9. Messaging
  10. DI
  11. IoC
  12. SOLID原則
Hidden comment
Hidden comment
tkoba2tkoba2

MVVM

tkoba2tkoba2

XAML

Hidden comment
tkoba2tkoba2

View、ViewModel間のやり取り

View ⇔ ViewModel

  • データ・バインディング機構
    • INotifyPropertyChanged
  • 名前空間:Microsoft.Toolkit.Mvvm.ComponentModel
    • ObservableObject
  • ViewModelとコードビハインドを通じて対話してはいけません。

  • Viewは、データ・バインディング機構を使ってViewModelの各プロパティの値を表示します。

  • XAMLだけでは足りない機能は、別途、ビヘイビア、トリガー、アクションを作成して対処します。

  • Modelの公開するステートをいちいちラップしてViewに公開するのもViewModelの役目です。

View → ViewModel

  • コマンド
    • ICommand
  • 名前空間:Microsoft.Toolkit.Mvvm.Input
    • RelayCommand
  • コマンドとは、Viewに公開する操作のことです。

  • ICommandインターフェイスの実装であるコマンドは、ViewModelのプロパティとして公開されます。

  • データ・バインディング経由でViewから操作されます。

  • コマンドは「メソッド」の公開ではなく、まさに「操作」の公開なのです。

View ← ViewModel

  • Messenger
    • Messenger
  • 名前空間:Microsoft.Toolkit.Mvvm.Messaging
    • WeakReferenceMessenger
  • データ・バインディング機構の応用によってViewModelからViewを操作する機構

  • ViewModelはMessengerからメッセージ・イベントを発行します。

  • ViewはViewModelのMessengerをあらかじめ監視していて、発行されたメッセージに対応したアクションを行えるという仕組みです。

  • 本質的にダイアログや画面遷移は揮発性の現象です

  • ViewModel上に、Viewへの揮発性の現象をイベントによって通知する専用のオブジェクトがあればよい

  • Messenger方式は、結局はデータ・バインディング機構の思想とまったく同じものです。

  • データバインディングは、揮発性の現象をViewModel→Viewに変更通知することに向かないので揮発性の現象を通知するためにMessenger機構を使用するが、思想的には、データバインディングと同じものであり、実装方法が異なるだけである。

引用元

tkoba2tkoba2

ViewModel、Model間のやり取り

ViewModel ⇔ Model

  • Binding
  • Modelの公開するステートをいちいちラップしてViewに公開するのもViewModelの役目です。

  • Modelは変更通知機能を持ちます。ViewModelと同じように、INotifyPropertyChangedインターフェイスの実装として行われます。

ViewModel → Model

  • 返り値のない関数呼び出し

ViewModel ← Model

  • Messaging

基本的考え

  • ViewModelはModelの影

  • ModelについてViewModelが行うことは、イベントに対する反応と戻り値のないメソッドの呼び出ししかない事

  • ViewModelはModelの影。この考え方が徹底されていれば、

    • Modelの呼び出し
    • Modelの呼び出し結果によるModel内状態の変化とそれに伴う変更通知イベント
    • Modelの呼び出しによる異常系発生が引き起こすModel内異常系通知イベント
    • Modelが発生させるその他イベント

    これらはみなModelの外からは切り離されて見える別々の事象

引用元

Hidden comment
Hidden comment
tkoba2tkoba2

コードビハインドに書いていいもの(書くしかないもの)

  1. IComponentConnector.InitializeComponent メソッド
    内部的に使用されるコードのため必須
    https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.markup.icomponentconnector.initializecomponent?view=windowsdesktop-6.0
  2. DataContextへの定義
     XAMLでは、引数有りのコンストラクタを指定できないため、ViewModelにDIコンテナを利用する場合は、コードビハインドにて登録する。
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            //1.IComponentConnector.InitializeComponent メソッド
            InitializeComponent();

            //2. DataContextへの定義(ViewModelにDIコンテナを利用する場合)
            DataContext = Ioc.Default.GetRequiredService<MainWindowViewModel>();
        }
    }
tkoba2tkoba2

未解決問題

  • XDG0062 The service provider has not been configured yet
    とりあえずほっとく。
tkoba2tkoba2

いろんな人の声

  1. とりあえずなんでもかんでもコンテナ管理はやめておいたほうがいいです。

コンテナ管理のメリットが得られる場面で適切に使用するようにと理解。
コンテナ管理のメリットが得られない場面で使用しても無意味。
そのためにコンテナ管理することの意味をよく理解することが必要。

tkoba2tkoba2

証憑データ管理ソフト

会社の経理もやっています。小さい会社なのでいろいろやらないといけないのですが、