中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

WPFでプロパティとイベントを作る場合のTips

WPFネタですよ。

コントロールを拡張する場合にイベント拾うだけってのと、継承するってのがあります。

独自のUserControlでもそうですが、CLRプロパティ(普通のpublic bool x{get;set;}などのことをこういう)は、XAMLから使えないので推奨されません。

public static readonly DependencyProperty データProperty = DependencyProperty.Register("データ", typeof(string), typeof(xxxclass));
public static RoutedEvent データ変更Event = EventManager.RegisterRoutedEvent("データ変更", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(xxxclass));
public event RoutedEventHandler データ変更
{
	add
	{
		AddHandler(データ変更Event, value);
	}
	remove
	{
		RemoveHandler(データ変更Event, value);
	}
}
public string データ
{
	get { return (string)GetValue(データProperty); }
	set { 
		SetValue(データProperty, value);
		RaiseEvent(new RoutedEventArgs(データ変更Event));
	}
}

依存プロパティにはPropertyをつける、CLRプロパティはそのままの名前でセッタゲッタをつくる、GetValue,SetValueは自前で作ってもいいけど、 コントロールの依存ツリーの上のほうにいてるDependencyObjectが持っているので自作しないってのがポイントです。

今回はイベントも作っていますが、通常は作る必要はないと思います。XAMLでバインドしている場合にはバインド側で検知できるからです。

作る場合には上記のようにEventManagerを使って登録します。利用する場合にはこちらもRaiseEventってのを使います。こちらはUIElementに実装されています。C#独特のevent == nullをせずにVBのように無条件に呼び出して問題ありません。

実態はstaticにあり、どのインスタンスにどのメソッドが結びついているのかいないのかはWPFエンジンが理解できるからです。その代りeventを独自実装する必要がありますが。

投稿日時 : 2008年5月4日 2:28

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント