如何使用BindableProperty.Create在Xamarin中为绑定创建默认值?

时间:2018-07-24 14:31:24

标签: xamarin xamarin.forms

我创建了一个模板来做标签:

<?xml version="1.0" encoding="utf-8"?>
<Grid Padding="20,0" xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:local="clr-namespace:Test;assembly=Test" 
      x:Class="Test.MyTemplate" 
      x:Name="this" >
    <Label Grid.Column="1" 
           IsVisible="{Binding LabelVisible, Source={x:Reference this}}"
           Text="Test" />
</Grid>

public partial class MyTemplate : Grid
{

    public event EventHandler Action;

    public MyTemplate()
    {
        InitializeComponent();
    }

    public static readonly BindableProperty LabelVisibleProperty =
        BindableProperty.Create(
            nameof(LabelVisible),
            typeof(bool),
            typeof(MyTemplate),
            true); // << I set this to true as I think it is for the default setting

    public bool LabelVisible
    {
        get { return (bool)GetValue(LabelVisibleProperty); }
        set { SetValue(LabelVisibleProperty, value); }
    }

}

如果我在页面中编写此代码,我希望此默认值为true:

<template:MyTemplate />

但是,即使将BindableProperty.Create的最后一个属性设置为true,我的标签仍然不可见(我认为这是设置默认值的地方)。

我不能正确设置默认值吗?

1 个答案:

答案 0 :(得分:0)

我猜测UI不会收到有关LabelVisible已更新的通知,并且不会相应地更新IsVisible。要么实现INotifyPropertyChanged接口,要么将propertyChanged参数添加到您的BindableProperty.Create调用中。

后者可以这样完成:

public static readonly BindableProperty LabelVisibleProperty =
    BindableProperty.Create(
        nameof(LabelVisible),
        typeof(bool),
        typeof(DataGridTemplate),
        true, onPropertyChanged: OnLabelVisiblePropertyChanged);

并实现这样的方法:

private static void OnLabelVisiblePropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
    if (bindable != null && bindable is DataGridTemplate template)
        template.MyLabel.IsVisible = (bool)newValue;
}

您必须给Label赋予一个x:Name值,此时绑定实际上并没有做太多事情:<Label x:Name="MyLabel" Grid.Column="1" Text="Test" />