C#でWPF学習中「INotifyPropertyChanged」

C# コンピュータ
C#

.NET SDK(dotnet.exe)をインストールしたのでWPFを初めてみました。
Visual Studio 2019などのIDEでないと厳しいかとも思いますが、dotnet.exeとVisual Studio Codeで少しずつ学習を進めています。

実行環境
Winodws10 Pro 2004
dotnet –version 5.0.102

プロジェクトの作成
mkdir <プロジェクト名>
cd <プロジェクト名>
dotnet new wpf
code .

ソースコード

ファイル名:MainWindow.xaml

<Window x:Class="WpfSample1.MainWindow"
        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:WpfSample1"
        mc:Ignorable="d"
        Title="{Binding Title}" Height="450" Width="800">
    <Grid>

    </Grid>
</Window>

Title=”{Bin…の行を書き換えています。

ファイル名:MainWindowViewModel.cs

using System.ComponentModel;

namespace WpfSample1
{
    class MainWindowViewModel : INotifyPropertyChanged
    {
        public MainWindowViewModel()
        {
            PropertyChanged += (o, e) => {};
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string name)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

        private string _title;

        public string Title
        {
            get
            {
                return _title;
            }
            set
            {
                if (_title == value) return;
                _title = value;
                OnPropertyChanged("Title");
            }
        }
    }
}

新規作成

ファイル名:MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfSample1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var vm = new MainWindowViewModel();
            DataContext = vm;
            vm.Title = "タイトル";

        }
    }
}

InitializeComponent();以下3行をを追加

説明
サンプルではウィンドウのタイトルバーを書き換えてみます。
MainWindow.xamlでView見た目のレイアウトを定義しています。タイトルを書き換えるにあたり、後からC#のコードで書き換える目印として、”{Binding Title}”と記述しています。

MainWindowViewModelはViewのデータソースとなるオブジェクトのクラスです。INotifyPropertyChangedを実装することで、プロパティとViewの項目を連動(データバインド)します。C#側でプロパティを書き換えるとView側で表示も変化します。今回の例ではタイトルバーを書き換えるため、プロパティ名をTitleとしています。

MainWindowはwpfにおけるプログラムの開始位置となります。厳密にエントリーポイントとは異なるとはおもいますが、今回はMainWindowViewModelのインスタンスを作成しDataContextとしてセットしています。その後プロパティのTitleに値をセットすることでタイトルバーが変化しています。

とりあえず学習したことを要約するとこのような感じになりました。INotifyPropertyChangedについて、調べてみましたが難しくあまり理解できませんでしたが、とりあえずViewModelとしてViewとの紐づけだけを押さえて、後はおまじないだと思って記述したところプログラムは動いてくれました。

コメント