Xamarin Forms - проблема привязки пользовательских элементов управления - PullRequest
2 голосов
/ 13 февраля 2020

Есть большая вероятность, что сегодня мне не хватило кофе, но у меня есть проблема, с которой я ходил кругами последние несколько часов.

Я создал CustomEntry класс, который является просто ContentView, содержащим Entry и несколько других битов, и я добавил новый BindableProperty к этому классу, который должен установить его свойство «Test».

План состоит в том, чтобы передать строковое значение из моего ViewModel через этот bindableproperty, а не просто жестко закодировать значение (например.) Я хочу передать значение из моей ViewModel, используя привязку (например, Test = "{Binding AStringFromMyViewModel}") - по какой-то причине, когда я пытаюсь использовать привязку, bindableproperty никогда не устанавливается.

Обратите внимание, что если я делаю жесткое кодирование значения, например, Test = "123", то оно работает нормально, но не работает, если я делаю Test = "{Binding AStringFromMyViewModel}" как я сделал ниже.

Вот что у меня есть:

Страница XML

<?xml version="1.0" encoding="UTF-8"?>
<pages:BasePage xmlns:pages="clr-namespace:ShoppingListNEW.Pages" NavigationPage.HasNavigationBar="True" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:helpers="clr-namespace:ShoppingListNEW.MarkupExtensions" xmlns:views="clr-namespace:ShoppingListNEW.Views" xmlns:yummy="clr-namespace:Xamarin.Forms.PancakeView;assembly=Xamarin.Forms.PancakeView" x:Class="ShoppingListNEW.Pages.SignUp">
    <StackLayout>
        <Label Margin="15,15,0,0" TextColor="#2b2c2e" Text="{helpers:TranslateExtension FirstName}"></Label>
        <views:CustomEntry Test="{Binding AStringFromMyViewModel, Mode=TwoWay}" BorderColor="Gray" HeightRequest="50" PlaceholderColor="Gray" Margin="15,0,15,0" BackgroundColor="Transparent" Text="{Binding FirstName}" TextColor="#232324" Placeholder="{helpers:TranslateExtension PleaseEnterYourFirstName}" AutomationId="txtFirstName" />
    </StackLayout>
</pages:BasePage>

Поддержка страницы

public partial class SignUp : BasePage
{
    public SignUp()
    {
        InitializeComponent();

        //Bind our UI to our ViewModel
        BindingContext = App.Locator.SignUpViewModel;
    }
}

Просмотр модели

public class SignUpViewModel : ViewModelBase
{
    //I expect this value of "123" to be passed to my BindableProperty but it's not
    public string AStringFromMyViewModel {get; set; } = "123";

    public SignUpViewModel()
    {
    }
}

И, наконец, м y новый элемент управления CustomEntry - я не думаю, что вам нужен XML, поскольку не работает только BindableProperty.

public partial class CustomEntry : ContentView, INotifyPropertyChanged
{
    public static readonly BindableProperty TestProperty =
        BindableProperty.Create("Test", typeof(string), typeof(CustomEntry), null, BindingMode.OneWay, null);

    public string Test
    {
        get
        {
            return (string)GetValue(TestProperty);
        }
        set
        {
    //This is never called
            SetValue(TestProperty, value);
        }
    }

    public CustomEntry()
    {
        InitializeComponent();
        BindingContext = this;
    }

}

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Как всегда, мне удается исправить это через 5 минут после публикации.

Похоже, что проблема была из-за BindingContext в CustomEntry. Удаление этого пинает все в жизнь, так что это мой следующий шаг!

0 голосов
/ 14 февраля 2020

Измените свой ViewModel для реализации INotifyPropertyChanged и измените свой AStringFromMyViewModel {get; set; } на

private string _aString;
public string AStringFromMyViewModel {
    get => _aString;
    set {
        _aString = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(AStringFromMyViewModel)))
    }
}
...