Xamarin.Forms:如何避免在 MVVM 绑定中硬编码字符串

Posted

技术标签:

【中文标题】Xamarin.Forms:如何避免在 MVVM 绑定中硬编码字符串【英文标题】:Xamarin.Forms: How To Avoid Hard-Coding a String in MVVM Bindings 【发布时间】:2017-04-29 06:19:07 【问题描述】:

在 Xamarin.Forms 中,我正在为 ButtonCommandProperty 创建一个 MVVM 绑定。

有没有办法避免对属性名称的字符串进行硬编码?

这种方式可行,但我想避免对字符串进行硬编码:

var submitButton = new Button();
submitButton.SetBinding(Button.CommandProperty, "SubmitButtonPressed");

我在 *** 上找到了类似的答案,展示了如何在 WinForms 中执行类型安全,但 Xamarin.Forms 使用不同的绑定引擎。

【问题讨论】:

How to make Databinding type safe and support refactoring的可能重复 好点!类似,但 Xamarin.Forms 使用与 WPF 不同的绑定机制 很高兴知道。我将详细了解它在 Xamarin 上的工作原理 【参考方案1】:

在 Xamarin.Forms 中创建 MVVM 绑定时,您可以使用两种方法来实现类型安全并避免硬编码字符串

第一道

引用视图模型并改用nameof

var myViewModel = new MyViewModel();
BindingContext = myViewModel;

var submitButton = new Button();
submitButton.SetBinding(Button.CommandProperty, nameof(MyViewModel.SubmitButtonPressed));

第二种方式(已弃用)

将 View Model 作为Type 包含在SetBinding 方法中,并使用Func

var myViewModel = new MyViewModel();
BindingContext = myViewModel;

var submitButton = new Button();
submitButton.SetBinding<MyViewModel>(Button.CommandProperty, vm => vm.SubmitButtonPressed);

使用此技术时,如果您在视图模型中重构 SubmitButtonPressed 属性的名称,新名称将渗透到您的视图中! 而且你再也不用担心打字错误了!

2017 年 1 月 23 日更新

从 Xamarin.Forms v2.3.4 开始,不推荐使用上面列出的“第二种方式”,即使用泛型设置数据绑定。 Xamarin.Forms 团队向我解释说,通用方式最终会在运行时转换为非通用方式,并且会产生巨大的成本,因为表达式解析是一项昂贵的、CPU 密集型的操作,会导致移动设备上的性能下降。

【讨论】:

我们这些使用 xaml 进行布局的人有什么希望吗? 在 XAML 中创建绑定时仍需要使用硬编码字符串。您可以使用 x:Name 为 XAML 属性创建名称,然后在代码隐藏中创建类型安全的绑定。

以上是关于Xamarin.Forms:如何避免在 MVVM 绑定中硬编码字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用任何框架(如 PRISM 或任何导航服务)的情况下按照 Xamarin.Forms 中的 MVVM 架构进行导航?

如何绑定到CarouselView(Xamarin.Forms)(MVVM)内部的ViewModel元素?

Xamarin.forms MVVM。列表视图仍然为空

在 Xamarin.Forms 项目中实现 MVVM

在 Xamarin.Forms 中使用 MVVM 进行页面导航

Xamarin Forms MvvM框架之FreshMvvM翻译一