值转换器

值转换器

介绍

如果你想要数据绑定两个具有不相容类型的属性,你需要在他们之间加一段代码,从源和目标之间互相转换。这段代码被称之为值转换器。一个值转换器是一个类,实现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;
    }
}
posted @ 2023-08-17 16:19  Juston007  阅读(45)  评论(0)    收藏  举报