IronPythonでデータバインディング その3

 27th April 2024 at 9:56pm

IronPythonスクリプト上で、WPF + XAML + MVVMパターンの更に続きです。

前回は、INotifyPropertyChangedインターフェースとICommandインターフェースを実装したクラスをC#のライブラリで作成しました。

世の中には便利なMVVM(Model/View/ViewModel)パターン用インフラストラクチャがいくつもあります。

PrismMVVM Light ToolkitLivetなど。

今回は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をコピーして下さい。

正常に動作すると以下のようになります。

ポイント

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のスクリプトで作ることには、やはり疑問を感じます。


HomeへIronPythonの記事Topへ