zoukankan      html  css  js  c++  java
  • Binding(三):资源和ValueConverter

        这节讲资源和值转换器(ValueConverter)。

    资源

        在XAML中,我们想要使用外部的数据或者类,需要引入其命名空间,然后将其定义为XAML页面的资源,供给控件使用,或者我们需要封装一个共用的样式,同样也需要定义成资源来使用,下面我们看一下如何定义一个资源:

    <Window.Resources>
            <ResourceDictionary>
                <sys:String x:Key="show">我是一个资源</sys:String>
                <Style x:Key="styleShow" TargetType="Button">
                    <Setter Property="Background" Value="Purple" />
                    <Setter Property="Foreground" Value="White" />
                </Style>
        </ResourceDictionary>
    </Window.Resources>        

        资源的类型是ResourceDictionary,顾名思义,资源是用键值对存储的,所以定义资源时需要给它个key,这个Key的value则根据定义资源的不同千变万化了,像上方代码中,定义一个string资源,它的value就是一个普通的字符串,定义一个样式资源,它的value就是一个定义样式的setter对象。

        那定义资源后,如何使用呢,这就又要用到标记扩展语法了,请看下面的代码:

    <StackPanel>
        <Button Content="{StaticResource show}" 
                Style="{StaticResource styleShow}" />
    </StackPanel>
    

      

        使用StaticResource命令获取一个资源,后面接资源的key,我给这个button引入了上方定义的资源,运行效果如下:

        另外,除了StaticResource,还有一个DynamicResource命令,StaticResource在程序一开始加载一次,如果资源中途变动,是不会再更新到使用它的控件上的,而DynamicResource则相反,它会跟着资源的更新而更新,所以要合理使用两者。

        后台代码中,声明资源和获取资源就简单多了,代码如下:

    this.Resources.Add("show", "我是个资源");//定义资源
    object data = this.Resources["show"];
    this.FindResource("show");

        后台无非就是操作键值对集合,并且我们也可以使用FindResource方法来寻找资源。

    ValueConverter

        上节我们提到一个情景,将Button的显示与隐藏跟CheckBox是否选中做绑定,这个就需要用到我们接下来讲的ValueConverter。

        首先我们需要新建一个类,代码如下:

    class BoolToVisibilityConvert : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return DependencyProperty.UnsetValue;
            if ((bool)value == true)
            {
                return Visibility.Visible;
            }
            else return Visibility.Collapsed;
        }
    ​
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return false;
            if ((Visibility)value == Visibility.Visible)
            {
                return true;
            }
            else return false;
        }
    }

         使用ValueConverter需要实现IValueConverter接口,其内部有两个方法,Convert和ConvertBack。我们在使用Binding绑定数据的时候,当遇到源属性和目标控件需要的类型不一致的,就可以使用ValueConverter,它就相当于一个桥,当数据从源到目标控件时,需要走Convert方法,我们在这个方法里边就可以自定义转换逻辑,当数据从目标控件到源时,需要走ConvertBack方法,我们可以在这里边自定义回转逻辑。

        上述代码中,我就实现了Button的Visibility属性和bool之间的转换,下面我们需要将这个类作为资源,载入XAML页面,让Button使用,代码如下:

    <Window.Resources>
            <ResourceDictionary>
                <local:BoolToVisibilityConvert x:Key="B2V" />
            </ResourceDictionary>
    </Window.Resources>

        这个ValueConverter类的命名空间就是当前项目的命名空间,所以直接使用local即可,local是默认代表当前代码的命名空间简称,具体相关XAML命名空间的知识参见前文:剖析XAML语言

        XAML代码如下:

    <StackPanel>
        <CheckBox x:Name="CB" Click="CheckBox_Click" />
        <Button
            Content="{StaticResource show}"
            Style="{StaticResource styleShow}"
            Visibility="{Binding ElementName=CB, Path=IsChecked, Converter={StaticResource B2V}}" />
    </StackPanel>

        程序运行效果如下:

        最后来解释一下转换方法的四个参数,第一个就是数据,我们要转换的值就是它,第二个参数是目标类型,当从bool转换为Visibility时,这个参数就是Visibility,反之则是bool,第三个参数是转换参数,可以在标记扩展中定义,第四个是文化参数,也是可以在扩展标记中定义,详见如下:

    Visibility="{Binding ElementName=CB, Path=IsChecked, Converter={StaticResource B2V},ConverterParameter=true,ConverterCulture=zh-CN}"

         第三个参数主要是提供一些转换上的辅助,带给我们用于转换的更多的信息,第四个我个人理解多用在国际化上,我们可以根据这个参数获取当前的语言环境,这两个都不是扩展属性,都不能使用标记扩展。

  • 相关阅读:
    经典SQL语句大全
    主键,外键,主键表,外间表
    一个不错的shell 脚本教程 入门级
    初窥Linux 之 我最常用的20条命令
    try catch finally 用法
    一个初学者对于MVC架构的理解
    第二次阶段冲刺2(6月1号)
    第二次阶段冲刺1(5月31号)
    学习进度条十三(第14周)
    学习进度条十二(第13周)
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/14932553.html
Copyright © 2011-2022 走看看