かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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の基本クラスを継承したときのみ有効になります。

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

後悔はしていない

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