我有一个XF应用程序。在我的ViewModel中,我有以下内容:
public ICommand ActBtnCmd { get; }
public ICommand AdpBtnCmd { get; }
public SettingsTabViewModel(SettingsTabPage settingsTabPage)
{
ActBtnCmd = new Command<Templates.Button>((btn) => MessagingCenter.Send(this, "ActBtn", btn));
AdpBtnCmd = new Command<Templates.Button>((btn) => MessagingCenter.Send(this, "AdpBtn", btn));
}
在我的XAML
中:
<t:Button Text="{Binding ActBtnText}"
TapCommand="{Binding ActBtnCmd}"
WidthRequest="30"
Theme="{Binding Theme}" />
在iOS中进行调试是没有问题的。但是,当我在Android中调试应用程序时,会在“应用程序输出”窗口中收到以下消息:
Binding: 'ActBtnCmd' property not found on 'xxx.SettingsTabViewModel', target property: 'xxx.Templates.Button.TapCommand'
Binding: 'AdpBtnCmd' property not found on 'xxx.SettingsTabViewModel', target property: 'xxx.Templates.Button.TapCommand'
但是当我像下面那样更改属性时,消息消失了:
public ICommand ActBtnCmd { get; set; }
public ICommand AdpBtnCmd { get; set; }
有人可以向我解释为什么我收到这些消息吗?为什么我只能在Android中获得它?
答案 0 :(得分:4)
这可能与要绑定到的bindable属性的 Binding Mode 有关。
大多数属性的默认绑定模式是OneWay
。当这些属性是数据绑定目标时,则从源设置目标属性。只需从属性中获取get;
。
如果绑定模式为TwoWay
,则源属性将同时需要get;
和set;
。这意味着,当a属性是数据绑定目标时,则从源(通常)设置目标,但源也从目标设置。
但是,如果source属性是只读的(仅在get;
中),您可能会看到该消息,因为活页夹无法确保它可以写回源。
要检验该理论,我建议使用Overriding the Binding Mode
如果目标属性上的默认绑定模式不适用于特定的数据绑定,则可以通过设置
Mode
的{{1}}属性(或Binding
属性)来覆盖它Mode
标记扩展名)到Binding
枚举的成员之一。
BindingMode
通过将<t:Button Text="{Binding ActBtnText}"
TapCommand="{Binding ActBtnCmd Mode=OneWay}" <!-- Note the Mode used -->
WidthRequest="30"
Theme="{Binding Theme}" />
设置为Mode
,它应该让解析器知道不要在属性上出现OneWay
并删除警告。
关于平台上运行时体验为何不同的原因,可能是平台使用了不同的XAML解析器,其中使用了不同的默认绑定模式,或者忽略了该警告消息。
答案 1 :(得分:0)
获取;只能使用构造函数设置。将其更改为:
{ get; private set; }
这样,只有get可以公开使用,但仍然可以通过类的方法进行修改。