在WPF的绑定控件操作中,经常会通过bool值或者某些特定的string值做出相应动作。但UI层控件的很多属性对应的都不是Bool值或者对应的只是固定的String值。

  这个时候有两方法解决该问题。

  1.是在后台cs中做出比较判断,然后根据相应结果传达UI层做出相应动作。

  2.是直接在UI界面写好,然后会自行根据传入值做相应动作。

  本文主要讲第二种方法。Demo在结尾会附上。

  一.基类,判断类代码(Bool篇)

  

 public class BoolToValueConverter<T> : IValueConverter
    {
        public T FalseValue { get; set; }
        public T TrueValue { get; set; }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return FalseValue;
            else
                return (bool)value ? TrueValue : FalseValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value != null ? value.Equals(TrueValue) : false;
        }
    }

  新建个类继承自IValueConverter,并将其继承方法名写出来(Convert和ConvertBack),这两个方法是逻辑判断的主要代码。Convert是将传入值做出判断和返回相应结果,此处是TrueValue或FalseValue。ConverBack是将返回结果反转换回来,本文并没有用到这个。

 

  二.新建个实用类

 public class BoolToBitmapImageConverter : BoolToValueConverter<BitmapImage> { }

  该类继承BoolToValueConverter<T>,因为Demo转换的是图片所以类型是BitmapImage。

  

  三.UI布置

 

    <Window.Resources>
        <view:BoolToBitmapImageConverter x:Key="boolImgConv" >
            <view:BoolToBitmapImageConverter.TrueValue>
                <BitmapImage UriSource="Resource/Status-True.png" />
            </view:BoolToBitmapImageConverter.TrueValue>
            <view:BoolToBitmapImageConverter.FalseValue>
                <BitmapImage UriSource="Resource/Status-False.png" />
            </view:BoolToBitmapImageConverter.FalseValue>
        </view:BoolToBitmapImageConverter>
    </Window.Resources>
        <StackPanel Width="260">
           <Image Height="40" Source="{Binding BoToIma, Converter={StaticResource boolImgConv}}" />
            <Button Content="True" Height="100" Click="ButtonTrue"/>
            <Button Content="False" Height="100" Click="ButtonFalse"/>
          </StackPanel>

  Source中BoToIma是绑定传入的数据,然后通过转换器Converter转换,转换显示结果在Key是boolImgConv中做图片绑定,在Window.Resource里设置True或False的绑定图片。

 

  四.StringToImage简单聊聊

  StringToImage和BoolToImage差不多,只是在Convert和ConvertBack中的逻辑判断做的相对细致些,比如:传入值“X”抛出值"Y",传入值“XX”抛出值"YY",传入值“XXX”抛出值"YYY"等等,做个IF判断或者Switch判断即可。

  算了,贴代码说话,语文不好是个硬伤。

 public class StringToImageSourceConverter : StringToValueConverter<ImageSource> { }

    public class StringToValueConverter<T> : IValueConverter
    {
        public ImageSource NormalValue { get; set; }
        public ImageSource CrestronErrorValue { get; set; }
        public ImageSource EncErrorValue { get; set; }
        public ImageSource AllErrorValue { get; set; }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string key = value == null ? null : value.ToString();
            if (string.IsNullOrEmpty(key) || key == "00")
            {
                return NormalValue;
            }
            else if (key == "01")
            {
                return CrestronErrorValue;
            }
            else if (key == "10")
            {
                return EncErrorValue;
            }
            else
            {
                return AllErrorValue;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null || value.Equals(NormalValue))
            {
                return "00";
            }
            else if (value.Equals(CrestronErrorValue))
            {
                return "01";
            }
            else if (value.Equals(EncErrorValue))
            {
                return "10";
            }
            else
            {
                return "11";
            }
        }
    }

 先定义四种状态,然后做if判断。新建类继承该类,完活,太细致的我也不懂。。。。
   UI层:Windows.Resource里设置绑定属性

  <view:StringToImageSourceConverter x:Key="stringImgConv">
            <view:StringToImageSourceConverter.NormalValue>
                <BitmapImage UriSource="Resource/Status1.png" />
            </view:StringToImageSourceConverter.NormalValue>
            <view:StringToImageSourceConverter.CrestronErrorValue>
                <BitmapImage UriSource="Resource/Status2.png" />
            </view:StringToImageSourceConverter.CrestronErrorValue>
            <view:StringToImageSourceConverter.EncErrorValue>
                <BitmapImage UriSource="Resource/Status3.png" />
            </view:StringToImageSourceConverter.EncErrorValue>
            <view:StringToImageSourceConverter.AllErrorValue>
                <BitmapImage UriSource="Resource/Status4.png" />
            </view:StringToImageSourceConverter.AllErrorValue>
        </view:StringToImageSourceConverter>

  

五.Demo附上

 

六.写的都是自己遇到的问题和见解,有错欢迎纠正,轻喷轻拍,非常感谢

posted on 2015-11-09 17:31  Khandasas  阅读(433)  评论(0编辑  收藏  举报