MVVM与复杂格式字符串的交叉绑定

本文关键字:绑定 字符串 复杂 格式 MVVM | 更新日期: 2023-09-27 17:53:07

我需要对Stuart的答案进行扩展,该答案涉及在运行时在iOS的MVVM交叉中格式化字符串。我想在运行时传入一个复杂的对象,并在值转换器中对其进行评估,以基本上实现我在android上使用西藏绑定所能实现的相同功能:

 local:MvxBind="Text 'Awaiting ' + Name + ' For 10 Minutes' " />

目前已尝试

set.Bind(txtTitle).To(vm => vm.Name).WithConversion("StringFormatPlus", new { before = "Awaiting", after = " For 10 minutes" });

我已经尝试将对象参数强制转换为动态,但它需要引用Microsoft c sharp dll,所以我不确定这是怎么回事。

public class StringFormatPlusValueConverter : MvxValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;
        if (parameter == null)
            return value;
        var dynamicParameter = parameter as dynamic;
        var before = dynamicParameter.before;
        var after = dynamicParameter.after;
        var format = "{0} {1} {2}";
        return string.Format(format, before, value, after);
    }
}

我一直在使用的解决方法是在视图模型上创建一个额外的getter属性,我可以随心所欲地格式化它,并在iOS视图控制器中绑定到它。它可以工作,但并不理想,并且用强耦合的视图逻辑扰乱了我的视图模型。

MVVM与复杂格式字符串的交叉绑定

您可以使用SourceDescribed方法通过Fluent Binding实现您想要的内容。在MvvmCross.Binding.BindingContext命名空间中找到。

public MvxFluentBindingDescription<TTarget, TSource> SourceDescribed(MvxBindingDescription description);
public MvxFluentBindingDescription<TTarget, TSource> SourceDescribed(string bindingDescription);

实施示例:

set.Bind(txtTitle).SourceDescribed("'Awaiting ' + Name + ' For 10 Minutes'");