WPF界面值转换器
单值转换器
/// <summary>
/// 单值通用转换器 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会员:普通会员}
/// </summary>
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
{
/// <summary>
/// 多值转换器
/// </summary>
/// <param name="values">参数值数组</param>
/// <param name="parameter">
/// <para>参数</para>
/// <para>各组比较值:比较条件(&或|):true返回值:false返回值:返回值类型枚举</para>
/// <para>v1;v2-1|v2-2;v3:&:Visible:Collapsed:1</para>
/// </param>
/// <returns></returns>
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<string> 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
}
}

浙公网安备 33010602011771号