[RxUI] 3.3 – 值转换器

[RxUI] 3.3 – 值转换器

值转换器应实现IBindingTypeConverter接口。看一个在Boolean和XAML Visibility之间进行转换的全局注册的转换器类型的示例:
https://github.com/reactiveui/ReactiveUI/blob/main/src/ReactiveUI/Platforms/windows-common/BooleanToVisibilityTypeConverter.cs

GetAffinityForObjects如何工作

如果无法转换对象,则返回0;如果可以转换,则返回其它任何值。最好使最大值。

public int GetAffinityForObjects(Type fromType, Type toType)
{
    if (fromType == typeof(string))
    {
        return 100; // any number other than 0 signifies conversion is possible.
    }
    return 0;
}

TryConvert如何工作

TryConvert函数接受四个参数。第一个是需要转换的值,第二个是目标值的类型。conversionHint就像转换器参数,而result是转换结果。如果转换陈宫,TryConvert函数应返回true,否则应返回false

public bool TryConvert(object from, Type toType, object conversionHint, out object result)
{
    try
    {
        result = !string.IsNullOrWhiteSpace((string)from);
    }
    catch (Exception ex)
    {
        this.Log().WarnException("Couldn't convert object to type: " + toType, ex);
        result = null;
        return false;
    }

    return true;
}

注册

如果要全局使用自定义转换器,则需要使用Splat Locator对其进行注册。

Locator.CurrentMutable.RegisterConstant(
    new MyCoolTypeConverter(), 
    typeof(IBindingTypeConverter)
);

使用

对于全局注册的转换器,是自动使用的。创建绑定后,将从在Splat中注册的转换器中选择具有最佳匹配度的转换器。作为可选的,可以提供一个特定的转换器,来覆盖VM到View或View到VM的默认值。在指定的情况下,无需注册转换器:

this.Bind(ViewModel, 
    viewModel => viewModel.ViewModelProperty, 
    view => view.Control.Property,
    vmToViewConverterOverride: new CustomTypeConverter());

指定vmToViewConverterOverride很重要,以确保不会意外的将转换器传递给conversionHint参数。

内联绑定转换器

可以将内联函数方法提供给Bind。这样可以快速提供一种转换方法。该方法避免了只为一种情况提供IBindingTypeConverter

this.WhenActivated(disposables =>
{
    this.Bind(this.ViewModel, 
        viewModel => viewModel.DateTime, 
        view => view.DateTextBox.Text, 
        this.ViewModelToViewConverterFunc, 
        this.ViewToViewModelConverterFunc)
        .DisposeWith(disposables);
});

private string ViewModelToViewConverterFunc(DateTime dateTime)
{
    return dateTime.ToString("O"); // return ISO 8601 Date ime
}

private DateTime ViewToViewModelConverterFunc(string value)
{
    DateTime.TryParse(value, out DateTime returnValue);
    return returnValue;
}

原文 https://www.reactiveui.net/docs/handbook/data-binding/value-converters

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注