2013年1月27日日曜日

DataBinding(その1)

データ・バインディングとは?

    「Binding」クラス・インスタンス値を、マークアップ拡張機能を使って
  指定した依存関係プロパティへデータ値としてセットする機能

                                                         (Xamlな)マークアップ拡張機能
                                                      ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<TextBox Margin="10" Text="{Binding ElementName=sldrSlider, Path=Value}"/>
                                        ④        ①                           ②                             ③

                ①Bindingクラス名(System.Windows.Data.Binding)

                ②初期化パラメータ1
                     :ElementNameプロパティに(名前付けされた)ソースエレメント名を指定

                ③初期化パラメータ2
                    :Pathプロパティに(名前付けされた)ソースエレメントのプロパティを指定

                ④TextBoxエレメントのText依存関係プロパティに指定する

 

例 ← 「Slider」の値をTextBoxに数値として表示

(コード)

#------------------------------------------------------
if ($host.Version.Major -eq 3) {
    powershell.exe
} else {
    powershell.exe -version 2 -sta
}

$xaml = @'
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Markup Extensions" Height="120" Width="175">

    <StackPanel>
        <TextBox Margin="10" Text="{Binding ElementName=sldrSlider, Path=Value}"/>
        <Slider Name="sldrSlider" TickPlacement="TopLeft" Margin="10"/>
    </StackPanel>

</Window>
'@

if ($host.Version.Major -eq 3) {
    add-type -assembly WindowsBase,PresentationCore,PresentationFramework,System.Xml,System.Xaml
} else {
    add-type -assembly WindowsBase,PresentationCore,PresentationFramework,System.Xml
}

$form = [System.Windows.Markup.XamlReader]::Parse($xaml)
$Form.ShowDialog() | out-null

#設定値を表示してみる。
$form.content.children[0].text      #<--TextBlockエレメントの文字列


(画面)
image

       

 







    受け取り側TextBoxのすべての依存関係プロパティ(除:Inheritなもの)
    (> $form.Content.Children[0] | dp2: )

    Name DP Type Value base
  =============== ========== ========================== ====
  IsMouseDirectlyOver Indirect,Xaml False Local
  IsKeyboardFocused Indirect,Xaml False Local
Text WPF Binding 4.67741935483871 Local
  IsMouseCaptured Indirect,Xaml False Local
  PageHeight Indirect,Xaml 18 Local
  Instance Indirect,Xaml System.Windows.Documents.TextEditor Local
  UndoManagerInstance Indirect,Xaml MS.Internal.Documents.UndoManager Local
  Margin WPF Direct 10,10,10,10 Local
  IsSelectionActive Indirect,Xaml False Local


    送り出し側のSliderのすべての依存関係プロパティ(除:Inheritなもの)
   (> $form.findname("sldrSlider") | dp2: )

    Name DP Type Value base
  =============== ========== ========================== ====
  Margin WPF Direct 10,10,10,10 Local
  IsKeyboardFocused Indirect,Xaml False Local
   Name WPF Direct sldrSlider Local
Value WPF Direct 4.67741935483871 Local
  PageHeight Indirect,Xaml 18 Local
  Instance Indirect,Xaml System.Windows.Documents.TextEditor Local
  UndoManagerInstance Indirect,Xaml MS.Internal.Documents.UndoManager Local
  TickPlacement WPF Direct TopLeft Local


Bidingインスタンスを見てみる
 
     改めて、上記例で以下の流れでBindingをたどってみる    <--逆からは辿れない
    > ターゲット・コントロール -> 依存関係プロパティ -> BindingExpression –> Binding
                       ①                           ②                              ③                       ④
    ①ターゲットコントロール
        > $form.Content.Children[0]
    ②依存関係プロパティ
    > $dp = [System.Windows.Markup.Primitives.MarkupWriter]::GetMarkupObjectFor(`
                 $form.Content.Children[0]).properties |
Select-Object -First 1

  Property Value
  ================= ==================================
  Name Text
  PropertyType System.String
  PropertyDescriptor MS.Internal.ComponentModel.DependencyObjectPropertyDescriptor
  IsAttached False
★  DependencyProperty Text
  Value 4.67741935483871
  Attributes {System.CLSCompliantAttribute,Chars,MS.Internal.ComponentModel.DependencyPropertyAttribute,System.SerializableAttribute...}
  IsComposite False
  StringValue 4.67741935483871
  Items {System.Windows.Markup.Primitives.ElementMarkupObject}
  TypeReferences {}
  IsConstructorArgument False
  IsValueAsString False
  IsContent False
  IsKey False


    ③BindingExpressionインスタンス
     > ($form.Content.Children[0]).GetBindingExpression($dp)

  Property名 Value
  ============== =================================================
  ParentBinding System.Windows.Data.Binding
  DataItem System.Windows.Controls.Slider Minimum:0 Maximum:10 Value:4.67741935483871
  ResolvedSource System.Windows.Controls.Slider Minimum:0 Maximum:10 Value:4.67741935483871
  ResolvedSourcePropertyName Value
Target System.Windows.Controls.TextBox: 4.677
TargetProperty Text
  ParentBindingBase System.Windows.Data.Binding
  BindingGroup  
  Status Active
  ValidationError  
  HasError False
  HasValidationError False
  IsDirty False
  ValidationErrors  


   ④ちなみに、Bindingインスタンスも見てみる
   > ($form.Content.Children[0]).GetBindingExpression($dp).ParentBinding

  Property名 Value
  ================ =================
  ValidationRules {}
  ValidatesOnExceptions False
  ValidatesOnDataErrors False
  ValidatesOnNotifyDataErrors True
  Path System.Windows.PropertyPath
  XPath  
  Mode Default
  UpdateSourceTrigger Default
  NotifyOnSourceUpdated False
  NotifyOnTargetUpdated False
  NotifyOnValidationError False
  Converter  
  ConverterParameter  
  ConverterCulture  
  Source  
  RelativeSource  
ElementName sldrSlider
  IsAsync False
  AsyncState  
  BindsDirectlyToSource False
  UpdateSourceExceptionFilter  
  FallbackValue {DependencyProperty.UnsetValue}
  StringFormat  
  TargetNullValue {DependencyProperty.UnsetValue}
  BindingGroupName  
  Delay 0


   次は、DataBindingの「方向」と「トリガー」について

0 件のコメント:

コメントを投稿