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
        }
    }

  

posted @ 2021-12-14 13:34  勤奋的二牛  阅读(118)  评论(0)    收藏  举报