Как добавить привязку TextAlignment к шаблону с помощью форм Xamarin? - PullRequest
1 голос
/ 20 марта 2020

У меня есть этот код XAML:

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout
    xmlns ="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:t="clr-namespace:Templates"
    x:Class="Japanese..EntryGrid"
    x:Name="this" >
      <t:HeaderTemplate Text="ABC" />
      <Entry HorizontalOptions="FillAndExpand"
             VerticalTextAlignment="{Binding EntryTextAlignment,  Converter={StaticResource stringToTextAligmentConverter}, Source={x:Reference this}}" 
             VerticalOptions="FillAndExpand"
             Text="{Binding EntryText,  Source={x:Reference this}}" />
</StackLayout>

и этот код C#:

public partial class EntryGrid : StackLayout
{ 
    public EntryGrid()
    {
        InitializeComponent();
    }
    public static readonly BindableProperty 
        EntryTextAlignmentProperty = 
        BindableProperty.Create(nameof(EntryText), 
        typeof(TextAlignment), 
        typeof(EntryGrid), 
        TextAlignment.Center, 
        BindingMode.TwoWay);
    public string EntryTextAlignment {
        get => (string)GetValue(EntryTextAlignmentProperty);
        set => SetValue(EntryTextAlignmentProperty, value); }
}

В шаблоне есть больше кода, но я только что включил то, что использовалось для этот вопрос.

То, что я пытаюсь сделать, это установить значение EntryTextAlignment в значение «Center» следующим образом:

<t:EntryGrid EntryTextAlignment="Start"
             HeightRequest="150" />

Но он не принимает мой запрос, и текст выравнивается по вертикали в Центр.

Кто-нибудь знает, что я могу делать не так?

1 Ответ

0 голосов
/ 20 марта 2020

Свойство TextAligment имеет значение Enum, TextAlignment. Чтобы правильно связать его, вам нужно изменить его с String на TextAlignment. Вы также можете использовать строку, но я думаю, что вам придется использовать конвертер для обработки. Примерно так:

    class StringToTextAligmentConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var aligment = (string)value;
        switch (aligment)
        {
            case "Start":
                return TextAlignment.Start;
            case "Center":
                return TextAlignment.Center;
            case "End":
                return TextAlignment.End;
            default:
                return TextAlignment.Start;
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return TextAlignment.Start;
    }
}

             xmlns:local="clr-namespace:YourApp.YourNameSpace.Converters"

В ваших объявлениях ContentPage в Xaml, затем:

    <ContentPage.Resources>
    <ResourceDictionary>
        <local:StringToTextAligmentConverterx:Key="stringToTextAligmentConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

Затем вызовите его в вашем Xaml следующим образом:

 <Entry VerticalTextAlignment="{Binding EntryTextAlignment,  Converter={StaticResource stringToTextAligmentConverter}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...