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

时间:2018-12-15 19:11:04

标签: uwp windows-10-universal uwp-xaml

我已经在Functions in 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>

// C#

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

2。使用IValueConverter

// Xaml

<CalendarDatePicker Date="{x:Bind Date,Converter={StaticResource StringtoDate},Mode=OneWay}"></CalendarDatePicker>

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

1 个答案:

答案 0 :(得分:2)

实际的区别在于参数的数量和易用性,如the doc中所述:

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

并根据 Raymond Chen的评论:

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

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

您看到的是,您只能在x:Bind ConvertStringToDate(Date)中说x:Bind,比IValueConverter转换值更容易和更漂亮