Привязка Xamarin Forms — перехват связанного значения и его изменение

У меня есть простой составленный настраиваемый элемент управления, который отображает текст, установленный для связанного свойства ControlText. В приведенном ниже примере вы можете видеть, что при нажатии кнопки элемент управления обновляется.

введите здесь описание изображения

Как я могу изменить код, чтобы метка, отображаемая элементом управления, принимала все, что ему отправляется, и преобразовывала ее в верхний регистр?

Поэтому вместо показа...

Количество=5

это бы показало...

СЧЕТ=5

В этом простом примере для этого можно использовать IValueConverter, но я хочу увидеть другую реализацию для гораздо более сложного примера, который мне нужно реализовать. Я ищу решение, которое перехватывает значение, установленное в коде позади, преобразует его и устанавливает его в свойство ControlText пользовательского элемента управления.

SimpleControl.xaml.cs

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class SimpleControl : ContentView
{
    public SimpleControl ()
    {
        InitializeComponent ();
    }

    public static readonly BindableProperty ControlTextProperty = BindableProperty.Create(
                                           propertyName: nameof(ControlText),
                                           returnType: typeof(string),
                                           declaringType: typeof(SimpleControl),
                                           defaultBindingMode: BindingMode.TwoWay,
                                           defaultValue: "Hello World");

    public string ControlText
    {
        get { return (string)base.GetValue(ControlTextProperty); }
        set { base.SetValue(ControlTextProperty, value); }
    }
}

Кроме того, я ожидаю, что во время выполнения эта точка останова сработает, но код никогда не останавливается на ней. Я устанавливаю свойство из SimplePageModel, поэтому мне кажется странным, что это никогда не срабатывает. Может ли кто-нибудь объяснить это и мне?

введите здесь описание изображения

SimpleControl.xaml

<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App7.SimpleControl"
             x:Name="this">
    <ContentView.Content>
        <StackLayout Margin="100">
            <Label Text="{Binding Source={x:Reference this}, Path=ControlText}" />
        </StackLayout>
    </ContentView.Content>
</ContentView>

SimplePage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App7"
             x:Class="App7.SimplePage">
    <ContentPage.Content>
        <StackLayout>
            <local:SimpleControl ControlText="{Binding ControlText}" />

            <Button Text="Update Control"
                Command="{Binding UpdateControl}" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

SimplePageModel.cs (с использованием FreshMVVM)

public class SimplePageModel : FreshBasePageModel
{
    public SimplePageModel() { }

    private int _index;

    public string ControlText { get; set; }

    public Command UpdateControl
    {
        get
        {
            return new Command((t) =>
            {
                ControlText = $"Count = {++_index}";
            });
        }
    }

    public override void Init(object initData)
    {
        ControlText = $"Count = 0";

        base.Init(initData);
    }
}

person John Livermore    schedule 19.06.2019    source источник
comment
Я хочу увидеть другую реализацию для гораздо более сложного примера - я не понимаю, почему преобразователя значений недостаточно даже для более сложного примера? Вы хотите изменить сохраненное значение, а не только отображаемое значение?   -  person Jason    schedule 19.06.2019
comment
Да исправить. Мой элемент управления в реальном мире использует BindableLayout для создания списка вкладок. Я хочу привязать строку List‹string› к свойству в элементе управления, но когда она установлена, я хочу преобразовать ее в List‹Tab›. Я не хочу открывать List‹Tab› внешнему миру, а просто хочу, чтобы с этим справился элемент управления. Я подумал, что если я увижу, как это сделать на этом простом примере, то я буду знать, как это сделать для более сложного примера. Надеюсь, это немного поможет...   -  person John Livermore    schedule 19.06.2019
comment
почему бы просто не сделать это в сеттере?   -  person Jason    schedule 19.06.2019
comment
На самом деле я пытался создать свойство _ControlText, к которому привязывается пользовательский элемент управления. И в установщике ControlText я преобразовал «значение» в верхний регистр и установил _ControlText. Но это не сработало. На самом деле точка останова, показанная выше, никогда не срабатывает. Я не уверен, почему точка останова тоже не работает, но я могу только предположить, что «набор» на самом деле никогда не вызывается. Очень запутанно.   -  person John Livermore    schedule 19.06.2019
comment
Я думаю, вам лучше сосредоточиться на решении этой проблемы, чем пытаться придумать какое-то сложное обходное решение. Я видел ваш предыдущий пост, но слишком много всего происходит, чтобы можно было легко отлаживать его, основываясь только на том, что вы опубликовали. Если вы хотите поделиться кодом, я бы не прочь взглянуть на него.   -  person Jason    schedule 19.06.2019
comment
Эй, Джон, мы хотим помочь. Не могли бы вы попытаться лучше сломать проблему?   -  person Saamer    schedule 19.06.2019
comment
Спасибо. Я работаю над простой кодовой базой, которой могу поделиться, чтобы лучше рассмотреть проблему.   -  person John Livermore    schedule 19.06.2019
comment
Я разместил пример кода на github.com/JohnLivermore/XamarinFormsControlDemo, в котором показано, как решить проблему. У меня сейчас работает. Спасибо за вклад каждого!   -  person John Livermore    schedule 20.06.2019


Ответы (1)


Вы также можете использовать триггеры для этой цели, так как не слишком ясно, в чем заключается идея, я просто предполагаю, что это может быть полезно: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/triggers

person zpouip    schedule 19.06.2019