值转换器
值转换器
介绍
如果你想要数据绑定两个具有不相容类型的属性,你需要在他们之间加一段代码,从源和目标之间互相转换。这段代码被称之为值转换器。一个值转换器是一个类,实现IValueConverter接口的Convert和ConvertBack方法。
如何实现值转换器
WPF已经提供了很多值转换器,但是你有时必须实现你自己的转换器。为了做到这个,添加一个类到你的项目中然后调用它,以“[源类型]To[目标类型]Converter”命名。这就是你需要做的。
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CUltureInfo culture)
{
//从Bool转换到Visibility
}
public object ConvertBack(object value, Type targetType, object parameter, CUltureInfo culture)
{
//从Visibility转换到Bool
}
}
如何在XAML中使用值转换器
第一件事情你需要去做的是映射你的值转换器的命名空间到XAML的命名空间。然后你可以在视图的资源中创建值转换器的实例并且给他一个名字。然后你可以通过使用静态资源扩展标记引用它。
<Window x:Class="Demo.Window1"
xmlns:converter="clr-namespace:Demo"
>
<Window.Resources>
<converter:BoolToViibilityConverter x:Key="BoolToVisibility">
</Window.Resources>
<Grid>
<Button Visibility={Binding HasFunction, Converter={StaticResource BoolToVisibility}}/>
<Grid>
</Window>
简化值转换的使用
如果你想要在XAML中使用值转换器,你必须添加它的一个实例到资源中,并且通过使用key引用它。这是复杂的,因为key通常只是转换器的名字。
一个简单和炫酷的技巧是从MarkExtension类派生值转换器。这个方法你可以创建并在绑定中使用它,类似Text={Binding Time, Converter={x:MyConverter}},这非常炫酷!
public abstract class BaseConverter : MarkupExtension
{
public override object ProvideValue(IServicePropvider provider)
{
return this;
}
}
StringFormat转换器
StringFormatConverter对于一个对象的隐式字符串转换(如果你想要绑定DateTime到TextBlock)是非常有用的转换器。
public class StringFormatConverter : BaseConverter, IValueConverter
{
public object Convet(object value, Type targetType, object parameter, CultureInfo culture)
{
string format = parameter as string;
if(!string.IsNullOrEmpty(format))
{
return string.Format(culture, format, value);
}
else
{
return value.ToString();
}
}
public object ConvetBank(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}

浙公网安备 33010602011771号