本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Caliburn.Micro に入門してみる その2

前回はとりあえずプロジェクトを作成し、 Caliburn.Micro のお作法に従った Hello,world のようなものをやってみました。
今回はこのプロジェクトを使って、データバインディングを確認をしてみます。

今回も先人の記録を辿りつつ進めていきたいと思います。

ちなみに Caliburn.Micro の Documents の中では Basic Configuration 項にこの部分が書いてありますが、ほんの少しでした。

データバインディング

ShellViewModel に Count プロパティを追加します。

public class ShellViewModel : PropertyChangedBase, IShell
{
  private int m_Count = 50;
  public int Count
  {
      get => m_Count;
      set
      {
          m_Count = value;
          NotifyOfPropertyChange(() => Count);
      }
  }
}

ShellView.xaml を以下のように編集してみます。

<Window x:Class="_02_Binding.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_02_Binding"
        mc:Ignorable="d"
        Title="ShellView" Height="300" Width="400">
  <Grid>
    <TextBlock Name="Count" FontSize="80"
               VerticalAlignment="Center" 
               HorizontalAlignment="Center"/>
  </Grid>
</Window>

これを実行すると以下のようになります。明示的に「Text=”{Binding Count}”」 と書いていないですが、 Caliburn がこのバインド処理を行ってくれます。今回の場合、TextBlock の Name と対応するプロパティを見つけて、バインドを行う処理となっています。

コマンドバインディング

続いて以下のように ShellViewModel クラスにメソッドとプロパティを追加してみます。

public class ShellViewModel : PropertyChangedBase, IShell
{
  private int m_Count = 50;
  public int Count
  {
      get => m_Count;
      set
      {
          m_Count = value;
          NotifyOfPropertyChange(() => Count);
          NotifyOfPropertyChange(() => CanIncrementCount);
      }
  }

  public void IncrementCount()
  {
      Count++;
  }
  public bool CanIncrementCount
  {
      get => m_Count < 80;
  }
}

そして、 ShellView.xaml も以下のように編集します。

<Window x:Class="_02_Binding.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_02_Binding"
        mc:Ignorable="d"
        Title="ShellView" Height="300" Width="400">
  <Grid>
    <TextBlock Name="Count"
               FontSize="80"
               VerticalAlignment="Center" 
               HorizontalAlignment="Center"/>
    <Button Name="IncrementCount"
            FontSize="20"
            Content="Increment"
            VerticalAlignment="Bottom"
            HorizontalAlignment="Center"
            Margin="20"/>
  </Grid>
</Window>

これを実行して、 Increment ボタンを押すと、カウンタがインクリメントされ、 80 カウントになるとボタンが無効となります。

先ほどと同様にバインディングを記述していませんが、各コントロールの Name プロパティと一致するものを見つけて、バインドする処理が Caliburn によって行われるため不要となっています。Command の Can 系についても、同様に接頭辞 Can が付いたものを見つけて判定処理としてくれています。

余談

もちろん、Name を設定せずに Text=”{Binding Count}” などと記述することも可能です。 ValueConverter が必要なときには、こちらのような書き方をする必要が出てきそうです。

プログラミング
すらりんをフォローする
すらりん日記
タイトルとURLをコピーしました