バインドされた文字列の更新

1. MaterialDesignWithMetroを作成したときと同様にして空のPrism WPFプロジェクトを作成し、Material Design In XAML ToolkitとMahApps.Metroを適用します。リポジトリのコードでは、プロジェクト名はDataBindingにしています。

2. MaterialDesignWithMetroのViews/MainWindow.xamlと同様、MetroWindowを使うように修正します。その後、下記のコードのハイライトした行を追加します。

Window内に現在の日時を表示し、ボタンを押して最新の日時に更新するWindowの準備をしています。日時を表示するLabelと日時を更新するButtonをStackPanel内に並べています。ContentControlは今回は使いませんが、変更前のまま残しています。

<metro:MetroWindow x:Class="DataBinding.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:metro="http://metro.mahapps.com/winfx/xaml/controls"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <Grid>
        <StackPanel>
            <Label FontSize="16" Content="{Binding DateTimeLabel}" />
            <Button Content="Update Time" Command="{Binding DateTimeUpdateButton}"/>
            <ContentControl prism:RegionManager.RegionName="ContentRegion" />
        </StackPanel>
    </Grid>
</metro:MetroWindow>

3. Views/MainWindow.xaml.csの書き換えはMaterialDesignWithMetroと同様です。

using MahApps.Metro.Controls;

namespace DataBinding.Views
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : MetroWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

4. ViewModels/MainWindowViewModel.csを下記のように書き換えます。ハイライトした行が書き換えた行または追加した行になります。

8行目でWindowのタイトルを”Prism DataBinding”に書き換えています。

15-20行目でMainWindow.xamlのLabelのContentにBindして表示する文字列のプロパティDateTimeLabelを用意しています。下記のように記述すると、文字列DateTimeLabelの値が変更された後すぐ表示される文字列も変化します。

22行目でMainWindow.xamlのButtonのCommandにBindするDateTimeUpdateButtonを用意しています。
26行目でButtonがクリックされたときに実行する関数DateTimeUpdateButtonExecuteを渡し、DelegateCommand型のDateTimeUpdateButtonオブジェクトを生成しています。

29-32行目はButtonが押されたときに呼ばれる関数を記述しています。System.DateTime.Now.ToString()でボタンがクリックされたときの日時文字列を取得し、DateTimeLabelにセットしています。DateTimeLabel文字列の値が変更された後すぐにMainWindowのLabelに表示される文字列も更新されます。

using Prism.Commands;
using Prism.Mvvm;

namespace DataBinding.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private string _title = "Prism DataBinding";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private string _dateTimeLabel = System.DateTime.Now.ToString();
        public string DateTimeLabel
        {
            get { return _dateTimeLabel; }
            set { SetProperty(ref _dateTimeLabel, value); }
        }

        public DelegateCommand DateTimeUpdateButton { get; }

        public MainWindowViewModel()
        {
            DateTimeUpdateButton = new DelegateCommand(DateTimeUpdateButtonExecute);
        }

        private void DateTimeUpdateButtonExecute()
        {
            DateTimeLabel = System.DateTime.Now.ToString();
        }
    }
}

5. 図の青枠の部分をクリックし、ビルドしてデバッグ実行を開始します。

6. 図のようなPrism DataBindingという名前のウィンドウが表示されます。プログラムを起動した日時がLabel部分にセットされています。Labelの下にはUpdate Timeというボタンがあります。

7. Update TimeボタンをクリックするとLabelの日時が更新されます。