绑定到自定义控件中的属性

时间:2018-08-20 19:08:21

标签: xamarin.forms

我有一个自定义控件CustomTextBox.xaml

<AbsoluteLayout xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="MyApp.Core.Controls.CustomTextBox"
         xmlns:controls="clr-namespace:MyApp.Core.Controls;assembly=MyApp.Core"
         BackgroundColor="White">

<AbsoluteLayout.GestureRecognizers>
    <TapGestureRecognizer Tapped="OnTapped"/>
</AbsoluteLayout.GestureRecognizers>

<Entry x:Name="textValueEntry" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0.5, 1, 0.9, 0.9" FontAttributes="Bold"/>
<Label x:Name="placeholderLabel" AbsoluteLayout.LayoutFlags="PositionProportional" AbsoluteLayout.LayoutBounds="0.05, 0.5" FontSize="18"/>

</AbsoluteLayout>

我希望能够从父视图绑定到textValueEntry控件。因此,我在CustomTextBox.xaml.cs中添加了一个可绑定的属性:

private string _textValue;
public string TextValue
{
    get
    {
        return _textValue;
    }
    set
    {
        _textValue = value;
    }
}

public static BindableProperty TextValueProperty = BindableProperty.Create(nameof(TextValue), typeof(string), typeof(CustomTextBox), string.Empty, BindingMode.TwoWay, null,
                                                                 (bindable, oldValue, newValue) =>
                                                                 {
                                                                     (bindable as CustomTextBox).textValueEntry.Text = (string)newValue;
                                                                 });

我尝试像这样从父视图绑定到它:

<controls:CustomTextBox HorizontalOptions="FillAndExpand" VerticalOptions="CenterAndExpand" HeightRequest="50" TextValue="{Binding UsernamePropertyInViewModel, Mode=TwoWay}"/>
启动应用程序时,

TextValue属性设置为UsernamePropertyInViewModel,正如我在textValueEntry中看到的那样。但是,当我更改textValueEntry中的文本时,它不会更新UsernamePropertyInViewModel。我如何绑定它,以便在我更改UsernamePropertyInViewModel中的文本时更新textValueEntry

1 个答案:

答案 0 :(得分:1)

据我所知,您的CustomTextBoxtextValueEntry没有绑定您的TextValue属性。

对于TextValue,您的BindableProperties属性也需要看起来像这样。您需要将 BindableProperty 设置为绑定的适当值。无需为TextValue使用私有后备变量。

public string TextValue
{
    get => (string)GetValue(TextValueProperty);
    set => SetValue(TextValueProperty, value);
}

Parent.Xaml

<Entry x:Name="textValueEntry" Text="{Binding Path=TextValue, Source={x:Reference Page}}" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0.5, 1, 0.9, 0.9" FontAttributes="Bold"/>

您的页面将需要一个{:{1}}的x:Name =“ Page”