用法
前面弄了數據綁定,現在有這樣一種需求:使用同一種類型,但需要以不同方式呈現的場景。
①有一個數值,但您希望以一種方式顯示零值,而以另一種方式顯示正數
②想要根據值檢查CheckBox,但值是一個字符串,如“是”或“否”而不是布爾值
③有一個以字節爲單位的文件大小,但您希望根據它的大小顯示爲字節,千字節,兆字節或千兆字節。
可能性幾乎無窮無盡。
WPF值轉換器需要實現IValueConverter接口,這個接口只需要實現兩個方法:Convert()和ConvertBack()。
顧名思義,這些方法將用於將值轉換爲目標格式,然後再返回。
讓我們實現一個簡單的轉換器,它將一個字符串作爲輸入,然後返回一個布爾值,以及相反的方式
<Window x:Class="值轉換器.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:值轉換器"
Title="ConverterSample" Height="140" Width="250">
<Window.Resources>
<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
</Window.Resources>
<StackPanel Margin="10">
<TextBox Name="txtValue" />
<WrapPanel Margin="0,10">
<TextBlock Text="Current value is: " />
<TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
</WrapPanel>
<CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Data;
namespace 值轉換器
{
/// <summary>
/// MainWindow.xaml 的交互邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public class YesNoToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch (value.ToString().ToLower())
{
case "yes":
case "oui":
return true;
case "no":
case "non":
return false;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is bool)
{
if ((bool)value == true)
return "yes";
else
return "no";
}
return "no";
}
}
}
代碼分析:TextBlock的Text和CheckBox 的IsChecked都是綁定在TextBox的Text上,當什麼都沒輸入的時候,Convert方法返回爲false,是個布爾值。
所以TextBlock顯示爲False,CheckBox 顯示爲不打勾。
當輸入yes的時候,Convert方法返回爲true,所以TextBlock顯示爲True,CheckBox 顯示爲打勾。
WPF有20多個內置轉換器
簡化
轉換器的強大之處在於它允許你將任意數據類型轉換爲另一個完全不同的數據類型.然而,相對於大多數應用場景,你只是想改變某些值的顯示方式而沒有必要將其轉換成另一個不同的類型,StringFormat屬性則可以很好的做到這一點.
使用一個綁定的 StringFormat 屬性時,你會丟失一些使用轉換器時的靈活性,但相應地,它會更簡單易用且不會在新文件中創建一個新類.
StringFormat 屬性的的功能就如同它的名字所表達的: 它通過簡單的調用 String.Format 方法來格式化輸出字符串
xmlns:system="clr-namespace:System;assembly=mscorlib"
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Time: {0:HH:mm}}" />
<StackPanel Margin="10">
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='de-DE', StringFormat=German date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='en-US', StringFormat=American date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='ja-JP', StringFormat=Japanese date: {0:D}}" />
</StackPanel>