データーバインディングの今後に考えてみた
添付プロパティーとプロパティーとバインドします。
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の強制値で伝搬する。