【问题标题】:Xamarin.Forms bindings - Is implicit type conversion being done in code, but not in XAML?Xamarin.Forms 绑定 - 隐式类型转换是否在代码中完成,而不是在 XAML 中?
【发布时间】:2018-04-04 05:59:19
【问题描述】:

在我正在工作的 Xamarin.Forms 项目中,我注意到我们将大量整数值绑定到标签文本。例如:

myLabel.SetBinding(Label.TextProperty, nameof(MyViewModel.TotalQty));

其中MyViewModel.TotalQty 是int。

This article from the Xamarin guide 说:

在 Xamarin.Forms 中,绑定不执行任何隐式类型转换,如果需要将非字符串对象显示为字符串,则必须提供类型转换器或使用 StringFormat。

但我正在使用的代码正在运行,因此显然存在隐式类型转换。所以我的结论是文章中的陈述是错误的/过时的,或者该陈述适用于 XAML,但不适用于代码。我在网上找不到答案 - 有人知道吗?

【问题讨论】:

  • 如果引用的文本是真的,这将与之前的Xaml 实现有明显的不同。如果源或目标属性没有任何显式的ValueSerializer 或TypeConverter 属性,我希望使用源或目标类型的TypeConverter,并且任何内置的TypeConverter 都应该能够转换为String。 String 的默认转换器当然可以。无论如何,在 C# 和 Xaml 中构建绑定之间应该没有区别,尽管对于任何类似 Trigger 的类型都可能存在差异,如果 Xamarin 甚至有这些类型的话。
  • (说清楚,我没有给你答案,但我会饶有兴趣地看这个问题。)

标签: c# xaml xamarin xamarin.forms implicit-conversion


【解决方案1】:

不是在谈论官方文档,但根据我的经验,我注意到绑定被设置为对象扩展(这些值就像object 一样简单地使用,如您所见here at the source code),并且应该具有显式类型从值到目标类型的内部转换,需要在创建可绑定属性时设置属性的类型。

例如:

public static readonly BindableProperty MyCommandProperty = BindableProperty.Create(nameof(MyCommand), typeof(Command), typeof(MyObjectType), null, BindingMode.OneWay);
public Command MyCommand
{
    get { return (Command)GetValue(MyCommandProperty); }
    set { SetValue(MyCommandProperty, value); }
} 

需要注意的几点:

  • 在静态BindableProperty的Create方法中,我设置了我的属性的真实类型(Command - 2nd arg);
  • 在我的属性中,我使用SetValue 方法,该方法接收object 值;
  • 类型化的 MyCommand 属性强制其内部使用为同一类型,如 MyProperty = new Command(() => { return; }); 并使 MyProperty = string.Empty; 等内容无效;

记住 XAML 代码是一种标记语言,整个代码将被“翻译”为 C#。在使用上自然可以有一些推论和约定,但适用的规则是一样的。

希望对你有帮助。 (对不起我的英语不好)

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2016-08-04
    相关资源
    最近更新 更多