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 中,我正在为 Button
的 CommandProperty
创建一个 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元素?