WPF快速入门教程之绑定Binding

2020-01-05 09:33:02丽君

但是有些数据显示要求无法通过StringFormat处理,则需要使用Binding的属性Converter来处理了 —— 即通过值转换器来处理。下面我们以上面用到的时间转化为例,假如我们要在前台显示yyyyMMdd格式的日期,此时从数据源显示到界面可以正确处理,但是在界面输入,它无法正确转化为源数据,即内置的Converter不支持,此时我们就需要自己实现值转换,示例 如下:

首先定义DateConverter,实现接口IValueConverter,代码如下:


class DateConverter : IValueConverter
{
 /// <summary>
 /// 数据源转界面显示
 /// </summary>
 /// <param name="value"></param>
 /// <param name="targetType"></param>
 /// <param name="parameter"></param>
 /// <param name="culture"></param>
 /// <returns></returns>
 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
  if (value.GetType() == typeof(System.DateTime))
  {
   return ((System.DateTime)value).ToString("yyyyMMdd");
  }
  else
  {
   return value;
  }
 }

 /// <summary>
 /// 界面显示转数据源
 /// </summary>
 /// <param name="value"></param>
 /// <param name="targetType"></param>
 /// <param name="parameter"></param>
 /// <param name="culture"></param>
 /// <returns></returns>
 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
 {
  if (targetType == typeof(System.DateTime) && value != null)
  {
   DateTime dt = DateTime.Now;
   string valuestr = value.ToString();
   if (DateTime.TryParse(valuestr, out dt))
   {
    return dt;
   }
   else if (valuestr.Length == 8)
   {
    string yearstr = valuestr.Substring(0, 4);
    string monthstr = valuestr.Substring(4, 2);
    string daystr = valuestr.Substring(6, 2);
    if (DateTime.TryParse(string.Format("{0}-{1}-{2}", yearstr, monthstr, daystr), out dt))
    {
     return dt;
    }
   }
  }
  return value;
 }
}

然后在Xaml文件中添加引用:

由于此处DateConvert直接定义在当前窗体类命名空间下,所以其已经默认添加了如下空间,如果定义在其他位置,则需要手动添加空间引用。