在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附上
六.写的都是自己遇到的问题和见解,有错欢迎纠正,轻喷轻拍,非常感谢