雑記帳

ブログを使わずにArrangeNoteで作っている公開雑記帳

Mar 02, 2008 - WPFのdata bindingをデバッグする

bindingしたDependency Propertyの値が意図した通りに変化しなくて困っていたとき、 運よく川西さんのブログでその解決方法が紹介されていたので非常に助かりました。

bindingオブジェクトに対してPresentationTraceSources.SetTraceLevelしてあげると、 bindingの動作のトレースがVisual StudioのOutputウィンドウ(出力ウィンドウ)に表示されます。

デバッガを使ってbindingの中まで追跡するのは大変だと思いますから、これはすごく便利です。

Mar 02, 2008 - BindingMode.OneWayで気を付ける点

WPFにおいて、Dependency Property同士をbindingしているのに何故かソースの値を変更してもターゲットの値が変わらなくてハマってしまいました。

原因はBinding.ModeにBindingMode.OneWayを指定していて、 かつ、ターゲットのDependency Propertyに値をセット(SetValue)してしまったことでした。

from mywpf import *

class FooObject(DependencyObject):
	def __init__( self ):
		pass
	def __GetFoo( self ):
		return self.GetValue( FooObject.FooProperty )
	def __SetFoo( self, value ):
		self.SetValue( FooObject.FooProperty, value )
	Foo = property( __GetFoo, __SetFoo )

FooObject.FooProperty = DependencyProperty.Register( 'Foo', String, FooObject )

class BarObject(DependencyObject):
	def __init__( self ):
		pass
	def __GetBar( self ):
		return self.GetValue( BarObject.BarProperty )
	def __SetBar( self, value ):
		self.SetValue( BarObject.BarProperty, value )
	Bar = property( __GetBar, __SetBar )

BarObject.BarProperty = DependencyProperty.Register( 'Bar', String, BarObject )

foo = FooObject()
bar = BarObject()
BindingOperations.SetBinding( bar, BarObject.BarProperty, Binding( 'Foo', Source=foo, Mode=BindingMode.OneWay ) )
foo.Foo = 'This is Foo.'		# bindingは維持している
print bar.Bar					# 'This is Foo'が表示される
bar.Bar = 'This is Bar.'		# bindingが外される
print foo.Foo					# 'This is Foo'のまま
foo.Foo = 'This is not Bar.'	# bar.Barには反映されない
print bar.Bar					# 'This is Bar'が表示される

記事の一覧

Copyright © 2008 Koichi Yamamoto