2013年09月05日

WPFサンプル:ObjectDataProviderを使いメソッドをバインドする (3)

   このエントリーをはてなブックマークに追加 Clip to Evernote
ObjectDataProviderの例をもうひとつお見せします。
今回のサンプルは、以下のような簡易デジタル時計です。

MethodBinding3


まずは、ObjectDataProviderにデータを供給するMyClockクラス。

public class MyClock {
    private System.Timers.Timer _timer = new System.Timers.Timer();
    public  ObjectDataProvider Provider { get; set; }
    public MyClock() {
        _timer.Interval = 1000;
        _timer.Elapsed += _timer_Elapsed;
        _timer.Enabled = true;
    }
    private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
        Provider.Refresh();
    }
    public string NowTime() {
        return DateTime.Now.ToLongTimeString();
    }
}

NowTimeが現在の時刻を返すメソッドです。このメソッドをUI側のTextBlockとバインドさせるのですが、 時刻の更新をObjectDataProviderに知らせる必要があります。
そのため、System.Timerを利用し、1秒おきに、ObjectDataProviderのRefreshメソッドを呼び出しています。
なお、このMyClockオブジェクトのProviderプロパティ(ObjectDataProvider型)は、以下のように、C#のコードビハインドで設定しています。

public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();
        MyClock myClock = this.Resources["myClock"] as MyClock;
        myClock.Provider = this.Resources["NowTime"] as ObjectDataProvider;
    }
}

C#のコードビハインドで記述するのはこれだけです。

XAMLを示します。

<Window x:Class="MethodBindingSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:MethodBindingSample"
        Title="MainWindow" Height="100" Width="200">
    <Window.Resources>
        <local:MyClock x:Key="myClock" />
        <ObjectDataProvider MethodName="NowTime" x:Key="NowTime"
                            ObjectInstance="{StaticResource myClock}"/>
    </Window.Resources>
    <Grid DataContext="{Binding Source={StaticResource NowTime}}">
        <TextBlock Height="28" Name="textBlock2" FontSize="18"
                   HorizontalAlignment="Center"
                   Text="{Binding Source={StaticResource NowTime}}" />
    </Grid>
</Window>

今回は、ObjectDataProvider の ObjectTypeプロパティではなく、ObjectInstanceプロパティを使ってみました。

WPFサンプル・目次


この記事へのコメント
GridにDataContextを指定してますが、これは必要なのでしょうか?
Posted by Akira at 2016年09月02日 07:44
ご指摘の通り、DataContextの指定は不要ですね(^^;;
ありがとうございました。
Posted by gushwell at 2016年09月02日 22:05
こちらこそありがとうございました!
ObjectDataProviderについて調べていたので、とても参考になりました!
シンプルなサンプルプログラムが最高です!
Posted by Akira at 2016年09月03日 18:44
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52333863