使用get绑定属性的问题;与获得;组;在Xamarin.Android

时间:2019-03-17 06:37:54

标签: c# xamarin xamarin.forms

我有一个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中获得它?

2 个答案:

答案 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解析器,其中使用了不同的默认绑定模式,或者忽略了该警告消息。

引用Xamarin.Forms Binding Mode

答案 1 :(得分:0)

获取;只能使用构造函数设置。将其更改为:

{ get; private set; }

这样,只有get可以公开使用,但仍然可以通过类的方法进行修改。