日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開發(fā)其它知識(shí) → WPF值通用的類型轉(zhuǎn)換器完整代碼

      WPF值通用的類型轉(zhuǎn)換器完整代碼

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2012/5/4 21:12:34字體大。A-A+

      作者:佚名點(diǎn)擊:176次評(píng)論:0次標(biāo)簽: wpf

      Actipro WPF Studiov11.1.0541 注冊(cè)版
      • 類型:編程控件大。58.9M語(yǔ)言:英文 評(píng)分:6.6
      • 標(biāo)簽:
      立即下載

      在WPF中應(yīng)用數(shù)據(jù)綁定時(shí)經(jīng)常需要做一些簡(jiǎn)單的邏輯判斷。

      比如ViewModel中有一個(gè)HasError(布爾值)的屬性表示是否有錯(cuò)誤。我需要將它綁定于Button的IsEnable屬性上,即:當(dāng)沒(méi)有錯(cuò)誤時(shí)Button可用。這時(shí)就需要將HasError取反。WPF默認(rèn)的綁定引擎是不支持的。

      還有一種情況比如ViewModel中有一個(gè)Sex(int值)的屬性表示性別,我需要將它綁定到TextBlock上,當(dāng)值為1時(shí)顯示男,值為2時(shí)顯示女。WPF默認(rèn)綁定也是不支持這種判斷的。

      于是一個(gè)通用的值轉(zhuǎn)換器就誕生了,用法如下:

      <Button IsEnabled="{Binding HasError, Converter={StaticResource GenericTypeConverter}, ConverterParameter='IsReverse=True'}">OK</Button>

      IsReverse參數(shù)表示是否取返,如果轉(zhuǎn)換的值為true則變?yōu)閒alse,反之亦然。

      <TextBlock Text="{Binding Sex, Converter={StaticResource GenericTypeConverter}, ConverterParameter='Alias=1:男|2:女|other:未知'}" />

      Alias參數(shù)表示將值映射為字符串,other表示當(dāng)遇到?jīng)]有指定的值時(shí)顯示的文本

      另外bool to Visibility的轉(zhuǎn)換可以自動(dòng)進(jìn)行,不需要指定參數(shù)。

      有意見歡迎指正

      完整代碼如下:

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

      namespace MoodSunshiny.WPF.Converter
      {
          /// <summary>
          /// 一個(gè)通用的類型轉(zhuǎn)換器,可以提供更多轉(zhuǎn)換控制參數(shù)
          /// </summary>
          public class GenericTypeConverter : IValueConverter
          {
              /// <summary>
              /// 是否反轉(zhuǎn)轉(zhuǎn)換源參數(shù)值
              /// 僅對(duì)bool類型的值有效
              /// </summary>
              private bool IsReverse { get; set; }

              /// <summary>
              /// 用于將轉(zhuǎn)換結(jié)果映射為其它字符串
              /// 例如:Alias=True:是|False:否
              /// </summary>
              private Dictionary<object, string> Alias { get; set; }
              
              /// <summary>
              /// 解析轉(zhuǎn)換參數(shù)
              /// </summary>
              private void AnalyseConvertParameter(string convertParameter)
              {
                  /*設(shè)置參數(shù)默認(rèn)值*/
                  IsReverse = false;
                  Alias = null;

                  if (!string.IsNullOrEmpty(convertParameter))
                  {
                      var pkvs = convertParameter.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                      foreach (var pkv in pkvs)
                      {
                          var pkvo = pkv.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                          if (pkvo.Length != 2)
                              throw new NotSupportedException("不支持設(shè)置:" + pkv);
                          var pk = pkvo[0].Trim();
                          var pv = pkvo[1].Trim();

                          switch (pk)
                          {
                              case "IsReverse":
                                  bool b;
                                  if (!bool.TryParse(pv, out b))
                                      throw new NotSupportedException("參數(shù)取值錯(cuò)誤:" + pkv);
                                  else
                                      IsReverse = b;
                                  break;
                              case "Alias":
                                  {
                                      Alias = new Dictionary<object, string>();
                                      var dfkvs = pv.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                                      foreach (var dfkv in dfkvs)
                                      {
                                          var dfkvo = dfkv.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                                          if (dfkvo.Length != 2)
                                              throw new NotSupportedException("不支持設(shè)置:" + dfkvo);
                                          var dfk = dfkvo[0].Trim();
                                          var dfv = dfkvo[1].Trim();

                                          object oKey = null;
                                          int i;
                                          if (dfk.Equals("true", StringComparison.OrdinalIgnoreCase))
                                              oKey = true;
                                          else if (dfk.Equals("false", StringComparison.OrdinalIgnoreCase))
                                              oKey = false;
                                          else if (dfk.Equals("other", StringComparison.OrdinalIgnoreCase))
                                              oKey = "other";
                                          else if (int.TryParse(dfk, out i))
                                              oKey = i;
                                          else
                                              throw new NotSupportedException("參數(shù)取值錯(cuò)誤:" + dfkv);

                                          Alias[oKey] = dfv;
                                      }
                                  }
                                  break;
                              default:
                                  throw new NotSupportedException("不支持的參數(shù)名:" + pk);
                          }
                      }
                  }
              }

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

                  try
                  {
                      var sourceType = value.GetType();
                      if (IsReverse && sourceType == typeof(bool))
                          value = !((bool)value);

                      if (targetType == typeof(string))
                      {
                          if (Alias != null && Alias.ContainsKey(value))
                              return Alias[value];
                          else if (Alias != null && Alias.ContainsKey("other"))
                              return Alias["other"];
                          else
                              return  value == null ? "" : value.ToString();
                      }
                      if (targetType == typeof(bool))
                      {
                          if (sourceType == typeof(Visibility))
                              return (Visibility)value == Visibility.Visible;
                      }
                      else if (targetType.IsEnum)
                      {
                          if (sourceType == typeof(bool) && targetType == typeof(Visibility))
                          {
                              return (bool)value ? Visibility.Visible : Visibility.Collapsed;
                          }
                          else
                          {
                              return Enum.Parse(targetType, value.ToString(), true);
                          }
                      }
                      else
                      {
                          return System.Convert.ChangeType(value, targetType);
                      }

                      return System.Convert.ChangeType(value, targetType);
                  }
                  catch
                  {
                      return null;
                  }
              }

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

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)