WPF界面值转换器
单值转换器
////// 单值通用转换器 ObjectConverter 比较值1|比较值2:true返回值:false返回值 /// eg1.Visibility="{Binding PanelStatus, Converter={StaticResource ObjectConverter},ConverterParameter=true:Visible:Collapsed}" /// eg2.Background="{Binding BgColor, Converter={StaticResource ObjectConverter},ConverterParameter=1:Red:Blue}" /// eg3.Text="{Binding Type, Converter={StaticResource ObjectConverter},ConverterParameter=1|2:VIP会员:普通会员} /// public class ObjectConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { try { string[] parray = parameter.ToString().ToLower().Split(':'); //将参数字符分段 parray[0]为比较值,parray[1]为true返回值,parray[2]为false返回值 if (value == null) return parray[2]; //如果数据源为空,默认返回false返回值 if (parray[0].Contains("|")) //判断有多个比较值的情况 return parray[0].Split('|').Contains(value.ToString().ToLower()) ? parray[1] : parray[2]; //多值比较 return parray[0].Equals(value.ToString().ToLower()) ? parray[1] : parray[2]; //单值比较 } catch (Exception ex) { throw ex; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { try { var returnValue = "otherValue"; string[] parray = parameter.ToString().ToLower().Split(':'); if (value == null) return returnValue; var valueStr = value.ToString().ToLower(); if (valueStr != parray[1]) return returnValue; else return parray[0].Contains('|') ? parray[0].Split('|')[0] : parray[0]; } catch (Exception ex) { throw ex; } } }
多值转换器
public class MultiObjectConverter : IMultiValueConverter
{
///
/// 多值转换器
///
/// 参数值数组
///
/// 参数
/// 各组比较值:比较条件(&或|):true返回值:false返回值:返回值类型枚举
/// v1;v2-1|v2-2;v3:&:Visible:Collapsed:1
///
///
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
try
{
string[] param = parameter.ToString().ToLower().Split(':'); //将参数字符串分段
string[] compareValues = param[0].Split(';'); //将比较值段分割为数组
if (values.Length != compareValues.Length) //比较源数据和比较参数个数是否一致
return ConvertValue(param[3], param[4]);
var trueCount = 0; //满足条件的结果数量
var currentValue = string.Empty;
IList currentParamArray = null;
for (var i = 0; i < values.Length; i++)
{
currentValue = values[i] != null ? values[i].ToString().ToLower() : string.Empty;
if (compareValues[i].Contains("|"))
{
//当前比较值段包含多个比较值
currentParamArray = compareValues[i].Split('|');
trueCount += currentParamArray.Contains(currentValue) ? 1 : 0; //满足条件,结果+1
}
else
{
trueCount += compareValues[i].Equals(currentValue) ? 1 : 0; //满足条件,结果+1
}
}
currentParamArray = null;
currentValue = string.Empty;
var compareResult = param[1].Equals("&") ?
trueCount == values.Length :
trueCount > 0; //判断比较结果
return ConvertValue(compareResult ? param[2] : param[3], param[4]);
}
catch (Exception ex)
{
throw ex;
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
private object ConvertValue(string result, string enumStr)
{
var convertResult = (ConvertResult)int.Parse(enumStr);
if (convertResult == ConvertResult.显示类型)
return result.Equals("collapsed") ? Visibility.Collapsed : Visibility.Visible;
if (convertResult == ConvertResult.布尔类型)
return System.Convert.ToBoolean(result);
return null; //后续自行扩展
}
private enum ConvertResult
{
显示类型 = 1,
布尔类型 = 2,
字符串类型 = 3,
整型 = 4,
小数型 = 5,
画刷类型 = 6,
样式类型 = 7,
模板类型 = 8
}
}