えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

WPF データーバインディング は大丈夫です

データーバインディングの今後に考えてみた

添付プロパティーとプロパティーとバインドします。
1)添付プロパティーの値を変更→SetValue→プロパティーに値を渡す→CoerceValueCallbackで値が変わるときがある。
結果 添付プロパティーとプロパティーの値が違う
2)プロパティーの値を変える→PropertyChangedCallback→SetValue→CoerceValueCallbackで値が変わるときがある。
結果 添付プロパティーとプロパティーの値が違う

そんなわけはありません。

というわけで調べてみた。

<Window x:Class="BindingTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    Title="Window1" Height="300" Width="300">
    <Grid>
    <Grid.RowDefinitions>
      <RowDefinition />
      <RowDefinition />
      <RowDefinition />
      <RowDefinition />
    </Grid.RowDefinitions>
    <Slider  Name="slider1" />
    <TextBox Grid.Row="1" Name="textBox1" Text="{Binding ElementName=slider1,Path=Value,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}" />
    <Label Grid.Row="2" Name="label1" Content="{Binding ElementName=slider1,Path=Value,diag:PresentationTraceSources.TraceLevel=High}"/>
    <Button Grid.Row="3" Name="button1" Click="button1_Click">Button</Button>
  </Grid>
</Window>

添付プロパティと依存関係プロパティは強制値コールバックの実装には違いがないので依存関係プロパティで確認してみた。
今回は強制値コールバックを行っている Slider を使った。Slider は Min/Max/Current シナリオ を実装している。規定値はMin=0/Max=10 である。
依存関係プロパティのコールバックと検証

1)依存関係プロパティーの値を変更 ボタンをクリックすれば slider1.Value =  - 10 となる
System.Windows.Data Warning: 92 : BindingExpression (hash=14347911): Got PropertyChanged event from Slider (hash=23264094) for Value
System.Windows.Data Warning: 97 : BindingExpression (hash=14347911): GetValue at level 0 from Slider (hash=23264094) using DependencyProperty(Value): '0'
System.Windows.Data Warning: 76 : BindingExpression (hash=14347911): TransferValue - got raw value '0'
System.Windows.Data Warning: 80 : BindingExpression (hash=14347911): TransferValue - implicit converter produced '0'
System.Windows.Data Warning: 85 : BindingExpression (hash=14347911): TransferValue - using final value '0'
System.Windows.Data Warning: 92 : BindingExpression (hash=49584532): Got PropertyChanged event from Slider (hash=23264094) for Value
System.Windows.Data Warning: 97 : BindingExpression (hash=49584532): GetValue at level 0 from Slider (hash=23264094) using DependencyProperty(Value): '0'
System.Windows.Data Warning: 76 : BindingExpression (hash=49584532): TransferValue - got raw value '0'
System.Windows.Data Warning: 85 : BindingExpression (hash=49584532): TransferValue - using final value '0'

ちゃんと Binding はMin=0の強制値で伝搬する。

2)プロパティーの値を変える TextBox の値を 20 に変更すれば Mode=TwoWay で Slider.Value を変更する
System.Windows.Data Warning: 91 : BindingExpression (hash=52697953): Got LostFocus event from TextBox (hash=22597652)
System.Windows.Data Warning: 86 : BindingExpression (hash=52697953): Update - got raw value '20'
System.Windows.Data Warning: 89 : BindingExpression (hash=52697953): Update - implicit converter produced '20'
System.Windows.Data Warning: 90 : BindingExpression (hash=52697953): Update - using final value '20'
System.Windows.Data Warning: 98 : BindingExpression (hash=52697953): SetValue at level 0 to Slider (hash=59109011) using DependencyProperty(Value): '20'
System.Windows.Data Warning: 92 : BindingExpression (hash=52697953): Got PropertyChanged event from Slider (hash=59109011) for Value
System.Windows.Data Warning: 97 : BindingExpression (hash=52697953): GetValue at level 0 from Slider (hash=59109011) using DependencyProperty(Value): '10'
System.Windows.Data Warning: 76 : BindingExpression (hash=52697953): TransferValue - got raw value '10'
System.Windows.Data Warning: 80 : BindingExpression (hash=52697953): TransferValue - implicit converter produced '10'
System.Windows.Data Warning: 85 : BindingExpression (hash=52697953): TransferValue - using final value '10'
System.Windows.Data Warning: 92 : BindingExpression (hash=40644060): Got PropertyChanged event from Slider (hash=59109011) for Value
System.Windows.Data Warning: 97 : BindingExpression (hash=40644060): GetValue at level 0 from Slider (hash=59109011) using DependencyProperty(Value): '10'
System.Windows.Data Warning: 76 : BindingExpression (hash=40644060): TransferValue - got raw value '10'
System.Windows.Data Warning: 85 : BindingExpression (hash=40644060): TransferValue - using final value '10'

TextBox の値を 20 で Slider.Value には伝わるが Got PropertyChanged event from Slider で Binding はMax=10の強制値で伝搬する。

投稿日時 : 2009年6月2日 12:28

コメントを追加

# re: WPF データーバインディング は大丈夫です 2009/06/02 13:29 倉田 有大

実証ありがとうございます。
どういう実装になっているんでしょう?

2)プロパティーの値を変える TextBox の値を 20 に変更すれば Mode=TwoWay で Slider.Value を変更する

デバッグがよく読めないのですが、20で送った後、コントローラーで10に編集され、さらに、その10の値がプロパティーにもどされてくるんでしょうか?

コントローラー側のOnPropetyChangeイベントにSetValueしなおしているのかな。

# re: WPF データーバインディング は大丈夫です 2009/06/02 15:25 しらちゃん

この操作が終わった後で、TextBoxの値をもう一度'20'にすると・・・
System.Windows.Data Warning: 91 : BindingExpression (hash=14347911): Got LostFocus event from TextBox (hash=51393439)
System.Windows.Data Warning: 86 : BindingExpression (hash=14347911): Update - got raw value '20'
System.Windows.Data Warning: 89 : BindingExpression (hash=14347911): Update - implicit converter produced '20'
System.Windows.Data Warning: 90 : BindingExpression (hash=14347911): Update - using final value '20'
System.Windows.Data Warning: 98 : BindingExpression (hash=14347911): SetValue at level 0 to Slider (hash=23264094) using DependencyProperty(Value): '20'

となり、TextBoxの20と、Labelの10で値が違ってきますね。

# re: WPF データーバインディング は大丈夫です 2009/06/06 14:46 えムナウ

>どういう実装になっているんでしょう?
見せているソース以外の実装はありません。
>デバッグがよく読めないのですが、20で送った後、コントローラーで10に編集され、さらに、その10の値がプロパティーにもどされてくるんでしょうか?
デバッグは自分で組み込んでやって確認しましょう。
10にするのは強制値コールバックです。

# re: WPF データーバインディング は大丈夫です 2009/06/06 14:49 えムナウ

>この操作が終わった後で、TextBoxの値をもう一度'20'にすると・・・
Got PropertyChanged event from Slider は入らないんですかね?
今は外なんで確認できないんですが。

タイトル
名前
URL
コメント