wpf Visibility 前台xml 绑定int类型值,通过再转化实现对应属性值更改

博客介绍了如何在WPF中使用MVVM模式,通过XML资源绑定整数(int)类型值,并转换为Visibility枚举,实现在前台界面中控制元素的可见性状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对应的工具类:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;

namespace wpfYourSystem.Util
{
    /// <summary>
    /// 一个通用的类型转换器,可以提供更多转换控制参数
    /// </summary>
    public class GenericTypeConverter : IValueConverter
    {

        /// <summary>
        /// 正向键值对字典
        /// </summary>
        private Dictionary<string, string> Alias { get; set; }

        /// <summary>
        /// 反向键值对字典
        /// </summary>
        private Dictionary<string, string> BackAlias { get; set; }

        private string aliasStrTemp = "";
        /// <summary>
        /// 解析转换规则
        /// </summary>
        /// <param name="aliasStr">规则字符串</param>
        private void ParseAliasByStr(string aliasStr)
        {
            if (aliasStrTemp == aliasStr)
                return;
            aliasStrTemp = aliasStr;
            Alias = new Dictionary<string, string>();
            BackAlias = new Dictionary<string, string>();

            string content = aliasStr;

            if (aliasStr.Contains("Alias="))
            {
                content = aliasStr.Split('=')[1];
            }
            Alias = new Dictionary<string, string>();
            string[] arr1 = content.Split('|');
            foreach (string item in arr1)
            {
                string[] arr2 = item.Split(':');
                if (arr2[0] != "other")
                    BackAlias.Add(arr2[1], arr2[0]);
                Alias.Add(arr2[0], arr2[1]);
            }
        }

        private object ConvertCommon(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture, bool isBack)
        {
            if (value == null || string.IsNullOrWhiteSpace(parameter.ToString()))
                return null;
            object ret = value;//如果没有匹配返回传入的值

            ParseAliasByStr(parameter.ToString());
            Dictionary<string, string> alias;
            if (isBack)
                alias = BackAlias;
            else
                alias = Alias;

            //绑定的值
            string bindingValue = value.ToString();
            if (alias.ContainsKey(bindingValue))
                ret = StringToTargetType(alias[bindingValue], targetType);
            else if (alias.ContainsKey("other"))
                ret = StringToTargetType(alias["other"], targetType);
            else if (alias.ContainsKey("else"))
                ret = StringToTargetType(alias["else"], targetType);
            return ret;
        }

        /// <summary>
        /// 字符串转换成目标类型,如需添加一个目标类型只需在该方法中添加一个类型判断之后转换
        /// </summary>
        /// <param name="strValue"></param>
        /// <param name="targetType"></param>
        /// <returns></returns>
        private object StringToTargetType(string strValue, Type targetType)
        {
            object ret = null;
            //目标类型 string
            if (targetType == typeof(string) || targetType == typeof(char))
            {
                ret = strValue;
            }
            //目标类型 char
            if (targetType == typeof(char))
            {
                if (strValue.Length == 1)
                    ret = strValue;
            }
            //目标类型 int
            if (targetType == typeof(int))
            {
                int temp;
                if (int.TryParse(strValue, out temp))
                    ret = temp;
                else
                    ret = 0;
            }
            //目标类型 double
            if (targetType == typeof(double))
            {
                double temp;
                if (double.TryParse(strValue, out temp))
                    ret = temp;
                else
                    ret = 0;
            }
            //目标类型 float
            if (targetType == typeof(float))
            {
                float temp;
                if (float.TryParse(strValue, out temp))
                    ret = temp;
                else
                    ret = 0;
            }
            //目标类型 decimal
            if (targetType == typeof(decimal))
            {
                decimal temp;
                if (decimal.TryParse(strValue, out temp))
                    ret = temp;
                else
                    ret = 0;
            }
            //目标类型 bool? bool
            if (targetType == typeof(bool?) || targetType == typeof(bool))
            {
                bool temp;
                if (bool.TryParse(strValue, out temp))
                    ret = temp;
                else
                    ret = false;
            }

            //目标类型 Visibility
            if (targetType == typeof(Visibility))
            {
                switch (strValue.ToLower())
                {

                    case "collapsed":
                        ret = Visibility.Collapsed;
                        break;
                    case "hidden":
                        ret = Visibility.Hidden;
                        break;
                    case "visible":
                        ret = Visibility.Visible;
                        break;
                    default:
                        ret = Visibility.Visible;
                        break;
                }
            }



            return ret;
        }


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

            return ConvertCommon(value, targetType, parameter, culture, false);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

            return ConvertCommon(value, targetType, parameter, culture, true);

        }
    }
 }

 

Resouce:

  xmlns:util="clr-namespace:wpfYourSystem.Util" 
 <util:GenericTypeConverter x:Key="anyTypeConverter"/>

XML:

  <TextBlock Text="已过号" HorizontalAlignment="Right" FontWeight="Bold" FontSize="20" 
                                           Visibility="{Binding IntState,Converter={StaticResource anyTypeConverter},ConverterParameter='2:Visible|other:Collapsed'}"
                                           Foreground="Red"  Margin="0 0 20 0" VerticalAlignment="Center" />

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值