タグ:

カスタム関数を介したバインド

ただ単純にデータをバインドさせるというのはそう問題でもないのですが、例えばにテキストボックスに金額を入れると自動的にもう一個のテキストに消費税込みの値段を出したい時もあると思います。そのようなちょっと凝ったバインドの方法です。

デザイン (WPF)

<Window x:Class="MyWpfApp.Converter" 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  xmlns:c="clr-namespace:WpfApplication1.MyWpfApp"  
  Title="Window1" Height="300" Width="300">
  
  <Window.Resources>
   <c:ConvertTax x:Key="Conv_Tax"/>
  </Window.Resources>
  <Grid>
   <TextBox Height="23" Margin="12,12,0,0" Name="TextBox1" Width="120" />
   <Label Height="23" Margin="138,12,20,0" Name="Label1" >値段</Label>
   <TextBox Height="23" Margin="12,41,0,0" Name="TextBox2" 
     Text="{Binding ElementName=TextBox1, Path=Text,Converter={StaticResource Conv_Tax}}"/>
   <Label Height="23" Margin="138,41,20,0" Name="Label2" >税込み価格</Label>
  </Grid>
</Window>

コード (VB.net)

Imports System.Globalization

Namespace MyWpfApp

  <ValueConversion(GetType(String), GetType(String))> _
  Public Class ConvertTax
   Implements IValueConverter
   
    Const TaxRate As Double = 1.05
 
  Public Function Convert _
  (ByVal value As Object, _
   ByVal tType As System.Type, _
   ByVal param As Object, _
   ByVal cult As CultureInfo) _
   As Object Implements IValueConverter.Convert
   
     Dim temp As Double
     If Double.TryParse(value, temp) Then
       Return Math.Round(temp * TaxRate, 0)
     Else
       Return Nothing
     End If
  End Function
 
  Public Function ConvertBack _
  (ByVal value As Object, _
   ByVal tType As System.Type, _
   ByVal param As Object, _
   ByVal cult As CultureInfo) _
   As Object Implements IValueConverter.ConvertBack
  
    Dim str As String = DirectCast(value, String)
    Dim temp As Double
    If Double.TryParse(str, temp) Then
      Return Math.Round(temp / TaxRate)
    Else
      Return 0
    End If
  End Function
End Class
 
Class Window1
End Class
 
End Namespace

IValueConverterインターフェースを実装したクラスで関連付けるようにします。デザインコードのxmlns:c="clr-namespace:WpfApplication1.MyWpfApp" の部分ですが、WpfApplication1.MyWpfAppは空間名です。また、コードのほうを書き終わった後にビルドしないとエラーが表示されるようです。私はエラーがビルドした後も出ましたが無視して実行することが出来ました。