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

Bra*_*ick 3 c# binding mvvm xamarin xamarin.forms

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

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

这种方式有效,但我想避免硬编码字符串:

var submitButton = new Button();
submitButton.SetBinding(Button.CommandProperty, "SubmitButtonPressed");
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*ick 7

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

第一道路

引用视图模型并nameof改为使用.

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

var submitButton = new Button();
submitButton.SetBinding(Button.CommandProperty, nameof(MyViewModel.SubmitButtonPressed));
Run Code Online (Sandbox Code Playgroud)

第二种方式(已弃用)

包括视图模型作为TypeSetBinding方法和使用Func.

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

var submitButton = new Button();
submitButton.SetBinding<MyViewModel>(Button.CommandProperty, vm => vm.SubmitButtonPressed);
Run Code Online (Sandbox Code Playgroud)

使用此技术时,如果您SubmitButtonPressed在视图模型中重构属性的名称,新名称将渗透到您的视图!你永远不必再担心错别字!

更新,2017年1月23日

从Xamarin.Forms v2.3.4开始,不推荐使用上面列出的"使用泛型设置数据绑定"的"第二条道路".Xamarin.Forms团队向我解释说,通用方法最终在运行时转换为非通用方式,并且由于表达式解析是一项昂贵的CPU密集型操作导致移动设备性能下降,因此导致成本高昂.