Binding的数据转换(Data Converter)

    当Source端Path所关联的数据与Target端目标属性数据类型不一致时,添加数据转换器(Data Converter),
简单的数据转换(如double转string)WPF类库会自动转换。
    手动转换时需要手动写Converter,创建一个类,并实现IValueConverter接口。
public interface IValueConverter
{
    object Convert(object value, Type targetType, object parameter, CultureInfo culture);//当数据从Binding的Source流向Target时调用
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);//反之调用ConvertBack
}

例:
用于在UI上显示图片和将Source的三个值映射到CheckBox控件的IsChecked属性值(bool?类型)

//种类,用于显示图片
public enum Category
{
    Bomber,
    Fighter
}
//状态 CheckBox对应的三种状态
public enum State
{
    Available,
    Locked,
    Unknown
}
//飞机类
public class Plane
{
    public Category Category { set; get; }
    public string Name { set; get; }
    public State State { set; get; }
}

提供两个Converter用于转换数据,一个将Category单项转为string(XAML自动解析为图片),另一个实现State与bool?的双向转换。

public class CategoryToSourceConverter :IValueConverter
{
    //将Category转换为Uri
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Category c = (Category)value;
        switch (c)
        {
            case Category.Bomber:
                return @"\Icons\Bomber.png";//数据在项目Icons目录里
            case Category.Fighter:
                return @"\Icons\Fighter.png";
            default:
                return null;
        }
    }
    //不被调用
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
//将Stae转换为bool?
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        State s = (State)value;
        switch (s)
        {
            case State.Available:
                return true;
            case State.Locked:
                return false;
            case State.Unknown:
            default:
                return null;
        }
    }

    //将bool?转换为State
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool? nb = (bool?)value;
        switch (nb)
        {
            case true:
                return State.Available;
            case false:
                return State.Locked;
            case null:
            default:
                return State.Unknown;
        }
    }

之后再XAML里消费这些Converter

<Window x:Class="Windows6.Window6_4_2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Windows6.BLL"
        Title="Window6_4_2" Height="266" Width="300">
    <Window.Resources>
        <local:CategoryToSourceConverter x:Key="cts"/>
        <local:StateToNullableBollConverter x:Key="stnb"/>
    </Window.Resources>
    <StackPanel Background="LightBlue">
        <ListBox x:Name="listBoxPlan" Height="160" Margin="5">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Width="20" Height="20"
                               Source="{Binding Path=Category, Converter={StaticResource cts}}"/>
                        <TextBlock Text="{Binding Path=Name}" Width="60" Margin="80,0"/>
                        <CheckBox IsThreeState="True"
                                  IsChecked="{Binding Path=State, Converter={StaticResource stnb}}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button x:Name="buttonLoad" Content="Load" Height="25" Margin="5,0"
                Click="buttonLoad_Click"/>
        <Button x:Name="btnSave" Content="Save" Height="25" Margin="5,5"
                Click="btnSave_Click"/>
    </StackPanel>
</Window>

最后实现两个按钮的点击事件

private void buttonLoad_Click(object sender, RoutedEventArgs e)
{
    List<Plane> planeList = new List<Plane>()
    {
        new Plane() {Category = Category.Bomber, Name = "B-1", State = State.Unknown},
        new Plane() {Category = Category.Fighter, Name = "F-22", State = State.Unknown}
    };
    this.listBoxPlan.ItemsSource = planeList;
}

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    StringBuilder sb = new StringBuilder();
    foreach (Plane p in listBoxPlan.Items)
    {
        sb.AppendLine(string.Format("Category={0},Name={1},State={2}", p.Category, p.Name, p.State));
    }
    File.WriteAllText(@"D:\test\PlaneList.txt", sb.ToString());
}
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。 图片 C++是C语言的继承,进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。 在C基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。C++目前流行的编译器最新版本是Borland C++ 4.5,Symantec C++ 6.1,和Microsoft Visual C++ 2012。C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。 图片 C++由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值