在x:Bind和IValueConverter中使用函数有什么区别?

Vig*_*esh 3 uwp windows-10-universal uwp-xaml

我已经在x:Bind (在Windows 10内部版本14393中引入)和IValueConverter中处理了两个 函数,以将转换后的值绑定到UI元素的属性。但是,我想知道哪种方法正确或有效地绑定了值。使用它们有什么区别。

示例:您可以同时使用x:Bind和IValueConverter中的Function来将字符串绑定到'calendardatepicker'。但是,哪个有效?

1.x:Bind中的功能

// Xaml

 <CalendarDatePicker Date="{x:Bind ConvertStringToDate(Date),Mode=OneWay}"></CalendarDatePicker>
Run Code Online (Sandbox Code Playgroud)

//C#

 public DateTimeOffset ConvertStringToDate(string date)
   {
      DateTime d;
      d = System.Convert.ToDateTime(date);
      d = DateTime.SpecifyKind(d, DateTimeKind.Local);
      return (DateTimeOffset)d;
   }
Run Code Online (Sandbox Code Playgroud)

2.使用IValueConverter

// Xaml

<CalendarDatePicker Date="{x:Bind Date,Converter={StaticResource StringtoDate},Mode=OneWay}"></CalendarDatePicker>
Run Code Online (Sandbox Code Playgroud)

//C#

 public class DateToStringConverter : IValueConverter
 {
    public object Convert(object value, Type targetType,
              object parameter, string language)
    {
        DateTime d = DateTime.Now;
        string date = (string)value;
        d = System.Convert.ToDateTime(date);
        d = DateTime.SpecifyKind(d, DateTimeKind.Local);
        return (DateTimeOffset)d;
    }
    public object ConvertBack(object value, Type targetType,
            object parameter, string language)
    {
            //blah blah
    }
}
Run Code Online (Sandbox Code Playgroud)

Muz*_*zib 5

实际差异在于参数数量和易用性,如doc所述

  • 实现价值转换的更简单方法
  • 绑定依赖于多个参数的一种方法

Raymond Chen的评论中

  • 函数是在编译时解析的,这既有利于正确性(如果数据类型错误,也会导致编译时错误)和性能(不必保持装箱和拆箱)。转换器会在运行时进行查找,因此您不会知道加载页面并获得运行时异常是您做错了。但是有时候轻松键入很方便。

我认为,拥有一个具有使用多个参数而不是实现一个接口的功能的功能会容易得多。

你看,你就可以说x:Bind ConvertStringToDate(Date)x:Bind这比更容易和漂亮的方式转换值IValueConverter

  • 函数是在编译时解析的,这既有利于正确性(如果数据类型错误,也会导致编译时错误)和性能(不必保持装箱和拆箱)。转换器会在运行时进行查找,因此您不会知道加载页面并获得运行时异常是您做错了。但是有时候轻松键入很方便。 (3认同)