Какая разница в использовании функций в x: Bind и IValueConverter? - PullRequest
0 голосов
/ 15 декабря 2018

Я работал над обеими функциями в x: Bind (который представлен в Windows 10 build 14393) и IValueConverter , чтобы связать преобразованные значения со свойством элемента пользовательского интерфейса.Но я хотел бы знать, какая процедура является правильной или эффективной для привязки ценностей.Какая разница в их использовании.

Пример: вы можете использовать обе функции в x: Bind и IValueConverter, чтобы связать строку с '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 голосов
/ 15 декабря 2018

Фактическая разница заключается в количестве параметров и простоте использования, как сказано в Документ :

  • Более простой способ достижения преобразования значения
  • Способ привязки зависит от более чем одного параметра

И из комментария Раймонд Чен :

  • Функции разрешаются во время компиляции, что обеспечивает как правильность (вы получаете ошибку во время компиляции, если вы неправильно указали тип данных), так и производительность (не нужно сохранять блокировку и распаковку).Конвертеры проверяются во время выполнения, поэтому вы не узнаете, что сделали это неправильно, загружаете страницу и получаете исключение времени выполнения.Но иногда свободная типизация удобна.

, и я думаю, что гораздо проще просто иметь функцию с бонусом возможности использования нескольких параметров вместо реализации интерфейса.

вы видите, вы можете просто сказать x:Bind ConvertStringToDate(Date) в x:Bind, что намного проще и удобнее для преобразования значений, чем IValueConverter

...