DataConverterについて
データをBindする途中でデータを変換する機能
具体的には、「System.Windows.Data.IValueConverter」実装クラスを
Bindingインスタンスの「Converter」プロパティに指定することで実現する。
「IValueConverter」インターフェースのコードは以下の通り
1: [System.Windows.Data.IValueConverter]::System.Object Convert(System.Object, System.Type, System.Object, System.Globalization.CultureInfo) 2: [System.Windows.Data.IValueConverter]::System.Object ConvertBack(System.Object, System.Type, System.Object, System.Globalization.CultureInfo)実際動かして確認してみる。
PowershellだけでWPF表示(Powershell3.0でも2.0でも稼働)
.NetFrameworkは3.0以上が必要
WPFの約束としてPowershellはSTAモードで動く必要あり
以下コードを
①Powershellコンソールにコピペして実行
②ISEで実行する時はすでにSTAモードなので適時修正して実行
注意:ブラウザによってはコピペで行頭に余分な空白が出来てしまうことあり
C:\temp> □'@ ← ここの行の行頭に空白あると動かない
1: #------------------------------------------------------ 2: if ($host.Version.Major -eq 3) {
3: powershell.exe4: } else {
5: powershell.exe -version 2 -sta 6: } 7: 8: if ($host.Version.Major -eq 3) {
9: add-type -assembly WindowsBase,PresentationCore,PresentationFramework,System.Xml,System.xaml10: } else {
11: add-type -assembly WindowsBase,PresentationCore,PresentationFramework 12: } 13: 14: $xaml = @'
15: <Window 16: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 17: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 18: xmlns:local="clr-namespace:TwoWayConverter;assembly=TwoWayConverter" 19: Title="TwoWayConverter" Height="220" Width="275"> 20: 21: <StackPanel> 22: <TextBox Margin="10"> 23: <TextBox.Text> 24: <Binding ElementName="sldrSlider" Path="Value"> 25: <Binding.Converter> 26: <local:DisplayTwoDecPlaces/> 27: </Binding.Converter> 28: </Binding> 29: </TextBox.Text> 30: </TextBox> 31: <Slider Name="sldrSlider" TickPlacement="TopLeft" Margin="10"/> 32: </StackPanel> 33: </Window> 34: '@ 35: 36: $code = @'
37: using System; 38: using System.Windows.Data; 39: namespace TwoWayConverter 40: { 41: //[ValueConversion( typeof( double ), typeof( string ) )] 42: public class DisplayTwoDecPlaces : IValueConverter 43: { 44: public object val; 45: public Type typ; 46: public object par; 47: public System.Globalization.CultureInfo cul; 48: 49: public object Convert( object value, Type targetType, 50: object parameter, System.Globalization.CultureInfo culture ) 51: { 52: val = value; 53: typ = targetType; 54: par = parameter; 55: cul = culture; 56: 57: double dValue = (double) value; 58: return dValue.ToString( "F2" ); 59: } 60: public object ConvertBack( object value, Type targetType, 61: object parameter,System.Globalization.CultureInfo culture ) 62: { 63: double dValue; 64: double.TryParse( (string) value, out dValue ); 65: return dValue; 66: } 67: } 68: } 69: '@ 70: 71: del C:\temp\work\TwoWayConverter.dll72: Add-Type $code -OutputAssembly "c:\temp\work\TwoWayConverter.dll" `
73: -ReferencedAssemblies @("WindowsBase","PresentationCore","PresentationFramework")
74: add-type -Path C:\temp\work\TwoWayConverter.dll 75: 76: $form = [System.Windows.Markup.XamlReader]::Parse($xaml) 77: 78: $Form.ShowDialog() | out-null
Conver機能の設定状況を確認してみる
「TextBox」エレメントの「Text依存関係プロパティ」に紐付された「Bindingインスタンス」に設定されている。以下のように2行実行すると、
1: $tb = $form.content.children[0] 2: $tb.GetBindingExpression([System.Windows.Controls.TextBox]::TextProperty).ParentBindingBindingインスタンスを表示すると、「Converter」プロパティに設定されている
1: ValidationRules : {} 2: ValidatesOnExceptions : False 3: ValidatesOnDataErrors : False 4: ValidatesOnNotifyDataErrors : True 5: Path : System.Windows.PropertyPath 6: XPath : 7: Mode : Default 8: UpdateSourceTrigger : Default 9: NotifyOnSourceUpdated : False 10: NotifyOnTargetUpdated : False 11: NotifyOnValidationError : False 12: Converter : TwoWayConverter.DisplayTwoDecPlaces <--★これ! 13: ConverterParameter : 14: ConverterCulture : 15: Source : 16: RelativeSource : 17: ElementName : sldrSlider 18: IsAsync : False 19: AsyncState : 20: BindsDirectlyToSource : False 21: UpdateSourceExceptionFilter : 22: FallbackValue : {DependencyProperty.UnsetValue} 23: StringFormat : 24: TargetNullValue : {DependencyProperty.UnsetValue} 25: BindingGroupName : 26: Delay : 0「Converter」の呼ばれ方状況を確認してみる
$form.content.Children[0].getBindingExpression([System.Windows.Controls.TextBox]::TextProperty).ParentBinding.Converter
以下のような値で、値が変化するたびに次々に呼ばれてるみたい
| Param | 値 | コメント |
| value | 4.759825328 | 変換してほしい「double」型の値が渡される |
| targetType | System.String | 変換してほしい型は「String」でお願い.. |
| parameter | ||
| culture | en-US |