如何编写类来接收用于自定义渲染器的属性?

时间:2017-09-25 12:14:38

标签: xamarin xamarin.forms

我见过这种编码风格:

    public CustomTextCell()
    {
    }

    public static readonly BindableProperty IsCheckedProperty =
    BindableProperty.Create(
            "IsChecked", typeof(bool), typeof(CustomTextCell),
        defaultValue: false);

    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }
}

和此:

public class ExtViewCell : ViewCell
{
    public bool NoTap { get; set; }
}

有人可以帮助解释这种差异。一个服务器与另一个服务器功能不同吗?在我的情况下,我需要的是将NoTap的值传递给自定义渲染器。我应该像第一个或第二个例子那样编码吗?

1 个答案:

答案 0 :(得分:1)

第二个是 POCO - 一个普通的旧C#对象 - 这是相对不言自明的,但没有更多用于保存数据的目的 - 而不是在这种情况下很多。

第一个更有趣,特别是在MVVM的上下文中。 SetValue不只是设置值,而且(在大多数情况下)会引发PropertyChanged事件(请参阅INotifyPropertyChanged),以通知订阅者,该属性已更改。

现在,这与您的自定义渲染器有什么关系?可以在视图中将该属性实现为普通属性 - 即没有通知 - 当最初设置IsChecked(并且没有绑定)时,它可能有用(但不能说,因为我不知道你的自定义渲染器)。无论如何,想象一下你会更新IsChecked的值。您可以从代码中执行此操作,并且想知道为什么此更改未在您的自定义渲染器中反映出来。 但是你的渲染器应该如何知道呢?对于较小的形式,可能有可能轮询每一个属性,但这是对资源的可怕浪费。 ( Xamarin.Forms只是不能这样工作。)你的页面/视图必须告诉你的自定义渲染器,有些东西已经改变了。 INotifyPropertyChanged救援。在您的自定义渲染器中,您可以订阅PropertyChanged事件并对正在更改的IsChecked作出反应,更新您的原生视图。