[Windows] DataBindingで時計を作る

DataBindingでバグを仕込んだのでオブジェクト更新時のターゲット更新の仕組みを理解しなおす。
Charles Petzoldの本の例から1分ごとに更新される時計を作る。
XAMLのソースコードは以下のようになる。このファイルに対して2種類のC#の実装が例として挙がっている。
ClockTicker1というクラスをリソースとして持っている。
BindingではこのリソースをStaticResourceで参照する。
Contentをターゲット、ClockTicker1のオブジェクトをソースとするbindingを設定。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:Petzold.DigitalClock"
Title="Digital Clock"
SizeToContent="WidthAndHeight"
ResizeMode="CanMinimize"
FontFamily="Bookman Old Style"
FontSize="36pt">
<Window.Resources>
<src:ClockTicker1 x:Key="clock" />
</Window.Resources>
<Window.Content>
<Binding Source="{StaticResource clock}" Path="DateTime" />
</Window.Content>
</Window>

一個目のソースコード。クラスはインタフェースINotifyPropertyChangedを実装。

using System;
using System.Windows;
using System.Windows.Threading;
using System.ComponentModel;
namespace Petzold.DigitalClock
{
public class ClockTicker1 : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public DateTime DateTime
{
get { return DateTime.Now; }
}
// Constructor sets timer.
public ClockTicker1()
{
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += TimerOnTick;
timer.Interval = TimeSpan.FromSeconds(1);
timer.Start();
}
// Timer event handler sets DateTime property.
void TimerOnTick(object sender, EventArgs args)
{
if (PropertyChanged != null)
PropertyChanged(this,
new PropertyChangedEventArgs("DateTime"));
}
}
}

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2個目のソースコード。property名、DateTimeの更新を知らせるイベントDateTimeChangedを作り、WPFからこのイベントを検知してもらうパターン。属性名にたいして、属性名Changedとするところがポイント。

using System;
using System.Windows;
using System.Windows.Threading;
namespace Petzold.DigitalClock
{
public class ClockTicker1
{
public event EventHandler DateTimeChanged;
public DateTime DateTime
{
get { return DateTime.Now; }
}
// Constructor sets timer.
public ClockTicker1()
{
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += TimerOnTick;
timer.Interval = TimeSpan.FromSeconds(1);
timer.Start();
}
// Timer event handler sets DateTime property.
void TimerOnTick(object sender, EventArgs args)
{
if (DateTimeChanged != null)
DateTimeChanged(this, new EventArgs());
}
}
}
広告
%d人のブロガーが「いいね」をつけました。