IronPythonスクリプト上で、WPF + XAML + MVVMパターンの更に続きです。
前回は、INotifyPropertyChangedインターフェースとICommandインターフェースを実装したクラスをC#のライブラリで作成しました。
世の中には便利なMVVM(Model/View/ViewModel)パターン用インフラストラクチャがいくつもあります。
Prism、MVVM Light Toolkit、Livetなど。
今回はLivetを試してみようと思います。
Livetは、 尾上 雅則さんが作られた和製のインフラストラクチャーです。私は、XAMLファイルに記載されたコメントが気に入って使い始めました。
<!--Viewに特別な要件が存在しない限りは、トリガーやアクションの自作にこだわらず積極的にコードビハインドを使いましょう -->
MVVMについてインターネットで調べると、コードビハインドを使っては絶対ダメぐらいの趣旨のページを度々見かけました。しかも結構難しくてプレッシャーでしたが、このコメントで気が少し軽くなりました。
Livetのメンテナーは現在、かずきさんです。かずきさんはC#、WPF、MVVMなどの記事を多数書いている方です。かずきさんのWPF入門には大変お世話になりました。
本記事はVisual Studio 2022 + IronPython3.4.1で試した記事です。
Visual Studio 2015と2017の古い記事は、こちらです。
サンプルプログラムの実行までの手順
こちらにサンプルプログラムを置きました。[Code] -> [Download ZIP]からzipファイルをダウンロードしてください。
Livet.dllの準備ができていない場合はここから始めます。
- こちらにアクセスして、Livetをインストールします。
- Visual Studio 2022を起動します。
- ファイル ⇒ 新規作成 ⇒ プロジェクト ⇒ Livet project template (.NET Framework) (C#) を選択します。
- フレームワークは「.NET Framework 4.8.1」を選択します。
- (何も編集せず、そのまま)ビルドします。
- 生成されたフォルダに、dllが生成されます。(Livet.dll、Livet.~.dll、Microsoft.Xaml.Behaviors.dll)
Livet.dllの準備ができている場合はここから始めます。
- サンプルプログラムのフォルダに、「InfrastructureAssemblies」フォルダを作成し、dllをコピーして下さい。
- スクリプトを実行します。スクリプトの実行方法は、「IronPythonのスクリプトをVisual Studio Codeで実行する方法」を読んでください。
.vscode\settings.json
のpythonPath
を適切に設定することを忘れないでください。
正常に動作すると以下のようになります。
ポイント
XAMLファイルのWindowタグは、
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:bh="http://schemas.microsoft.com/xaml/behaviors"
xmlns:vm="example_databinding_viewmodel"
Title="Example of data binding" Height="300" Width="300">
としました。
WPFとXAML名前空間の宣言は以下の2行。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
2018年頃まで使っていたSystem.Windows.Interactivity.dllが、Microsoft.Xaml.Behaviors.Wpf(Microsoft.Xaml.Behaviors.dll)になりました。
xmlns:bh="http://schemas.microsoft.com/xaml/behaviors"
詳しくはこちらをご覧ください。
またViewModelファイルは、
import clr
import os.path as path
from sys import path as systemPath
systemPath.append(path.join(path.dirname(__file__), "InfrastructureAssemblies"))
clr.AddReferenceToFile("Livet.Behaviors.dll")
clr.AddReferenceToFile("Livet.Core.dll")
clr.AddReferenceToFile("Livet.Mvvm.dll")
clr.AddReferenceToFile("Microsoft.Xaml.Behaviors.dll")
from Livet import ViewModel
from Livet.Commands import ViewModelCommand
と設定します。dllのパスを通すことがポイントです。
ひとこと
WPF + XAMLが昔とだいぶ異なっています。試行錯誤でIronPython上で動かしましたが、しっかり理屈が分かっているわけではありません。
とは言え、上のようなやり方でひとまず動作しそうです。
ちょっとボタンがほしい/GUIで結果を表示したい/スライダーで手軽にデバッグしたい、なんて時に威力を発揮しそうなのは変わらないと思います。
複雑なGUIをIronPythonのスクリプトで作ることには、やはり疑問を感じます。