StackingFayout上的Bindable属性不起作用

时间:2017-06-30 01:49:19

标签: c# xaml xamarin.forms

我想创建一个名为switch label的自定义控件。我把标签和开关放在堆栈布局中。我的目的是制作像SwitchCell这样的控件。

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MobileRKE.Controls.SwitchLabel"
             Orientation="Horizontal">
    <Label x:Name="lbTitle" HorizontalOptions="FillAndExpand" Text="{Binding Title}" VerticalOptions="Center"/>
    <Switch x:Name="swtValue"
            IsToggled="{Binding IsOn}"
            VerticalOptions="Start"/>
</StackLayout>

背后的代码

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class SwitchLabel : StackLayout
{
    public SwitchLabel()
    {
        BindingContext = this;
        InitializeComponent();
    }

    public static readonly BindableProperty TitleProperty = BindableProperty.Create(
        propertyName: nameof(Title),
        returnType: typeof(string),
        declaringType: typeof(SwitchLabel),
        defaultValue: string.Empty,
        defaultBindingMode: BindingMode.TwoWay);

    public static readonly BindableProperty IsOnProperty = BindableProperty.Create(
        propertyName: nameof(IsOn),
        returnType: typeof(bool),
        declaringType: typeof(SwitchLabel),
        defaultValue: false,
        defaultBindingMode: BindingMode.TwoWay);

    public string Title
    {
        get
        {
            return (string)GetValue(TitleProperty);
        }
        set
        {
            SetValue(TitleProperty, value);
        }
    }

    public bool IsOn
    {
        get
        {
            return (bool)GetValue(IsOnProperty);
        }
        set
        {
            SetValue(IsOnProperty, value);
        }
    }
}

我是否以正确的方式撰写? 当我将模型绑定到它时,我发现绑定没有触发

1 个答案:

答案 0 :(得分:0)

我自己很难理解精确可绑定的属性是如何工作的。 但是当我遇到这种情况时,我将onpropertyChanged处理程序添加到BindableProperty.Create()作为参数。并在视图中反映对控件的更改。

无论如何,关于你的情况,我认为你不需要添加可绑定属性,因为IsToggled已经是一个可绑定的属性。只需绑定到viewmodel中的boolean属性,这应该可行。