かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Kinkuma Framework 1.2.5リリースしました

ちょっと思いつきで、機能追加をしました。

KinkumaFrameworkとは

PrismのMVVMサポートライブラリを補強するのと、自己満足を目指して作られています。現時点ではWPFに特化することで作られています。

インストール方法

NuGetでPrismで検索すると出てくるKinkumaFrameworkをインストールすると完了です。

追加機能

今回追加した機能は、ViewModelに定義するDelegateCommandとメソッドの紐づけの自動化機能になります。今までDelegateCommandを定義しようとすると、以下のようなコードを書くのが一般的でした。

public partial class MainWindowViewModel : ViewModelBase
{
    public DelegateCommand HogeCommand { get; private set; }

    public MainWindowViewModel()
    {
        // コマンドの初期化
        this.HogeCommand = new DelegateCommand(HogeExecute, CanHogeExecute);
    }

    private void HogeExecute()
    {
        // 処理
    }

    private bool CanHogeExecute()
    {
        // 実行可否判定
        return true;
    }
}

書く場所は異なるかもしれませんが結局、コマンドのプロパティの定義。コマンド用のメソッドの定義。そしてそれらを紐づけるコードが必要になります。

今回のKinkuma Frameworkで用意した機能を使うと、この記述を簡略化できます。

public partial class MainWindowViewModel : ViewModelBase
{
    [AutoInitCommand]
    public DelegateCommand HogeCommand { get; private set; }

    [CommandMethod]
    private void HogeExecute()
    {
        // 処理
    }

    [CommandMethod]
    private bool CanHogeExecute()
    {
        // 実行可否判定
        return true;
    }
}

上記のように、AutoInitCommand属性をつけたコマンドはCommandMethod属性のついたメソッドの中から命名規約に従ったものを自動的に割り当てるようになります。これはKinkuma FrameworkのViewModelの基本クラスを継承したときのみ有効になります。

どうでしょう?少しはコードがすっきりしたような気がします。

後悔はしていない

コードを見てもらえばわかるのですが、かなり裏で激しくリフレクションを振り回しています。恐らく手で書くのに比べてかなり遅くなるはずです(キャッシュ効かせたりして少しでも早くなるようにはしてますが・・・)。
でもコードの字面上は、これくらいすっきりしたのが好みです。