Xamarin Формы, как добавить поведение в пользовательский элемент управления - PullRequest
0 голосов
/ 11 июля 2019

Я создал пользовательский элемент управления, который представляет собой ContentView с Label и Entry

xaml пользовательских элементов управления выглядит следующим образом:

<Label Text="{Binding Source={x:Reference ValidationControl}, Path=Caption}"/>
<Entry Text="{Binding Source={x:Reference ValidationControl}, Path=Value, Mode=TwoWay}" />

Код пользовательского элемента управления выглядит следующим образом:

public static readonly BindableProperty CaptionProperty = BindableProperty.Create(
    nameof(Caption), typeof(string), typeof(ValidationEntry), default(string));

public string Caption
{
    get => (string)GetValue(CaptionProperty);
    set => SetValue(CaptionProperty, value);
}

public static readonly BindableProperty ValueProperty = BindableProperty.Create(
    nameof(Value), typeof(string), typeof(ValidationEntry), default(string));

public string Value
{
    get => (string)GetValue(ValueProperty);
    set => SetValue(ValueProperty, value);
}

Я использую пользовательский элемент управления следующим образом

<controls:ValidationEntry Caption=”Name:” Value="{Binding FullName, Mode=TwoWay}" />

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

<controls:ValidationEntry Caption="Name:"
                          Value="{Binding FullName, Mode=TwoWay}">
    <controls:ValidationEntry.EntryBehaviors>
        <behaviors:EntryLengthValidatorBehavior IgnoreSpaces="True"/>
    </controls:ValidationEntry.EntryBehaviors>
</controls:ValidationEntry>

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете создать поведение напрямую, я добавляю NumericValidationBehavior в свою настраиваемую запись, чтобы проверить данные, если они двойные. Если тип данных не двойной, цвет текста будет установлен на красный.

enter image description here

Вот код xaml.

<StackLayout>
<local:MyEntry   local:NumericValidationBehavior.AttachBehavior="true">


</local:MyEntry>
</StackLayout>

Вот NumericValidationBehavior.cs

     public static class NumericValidationBehavior
{
    public static readonly BindableProperty AttachBehaviorProperty =
        BindableProperty.CreateAttached(
            "AttachBehavior",
            typeof(bool),
            typeof(NumericValidationBehavior),
            false,
            propertyChanged: OnAttachBehaviorChanged);

    public static bool GetAttachBehavior(BindableObject view)
    {
        return (bool)view.GetValue(AttachBehaviorProperty);
    }

    public static void SetAttachBehavior(BindableObject view, bool value)
    {
        view.SetValue(AttachBehaviorProperty, value);
    }

    static void OnAttachBehaviorChanged(BindableObject view, object oldValue, object newValue)
    {
        var entry = view as Entry;
        if (entry == null)
        {
            return;
        }

        bool attachBehavior = (bool)newValue;
        if (attachBehavior)
        {
            entry.TextChanged += OnEntryTextChanged;
        }
        else
        {
            entry.TextChanged -= OnEntryTextChanged;
        }
    }

    static void OnEntryTextChanged(object sender, TextChangedEventArgs args)
    {
        double result;
        bool isValid = double.TryParse(args.NewTextValue, out result);
        ((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
    }
}

Обновление

Я создаю пользовательское представление с ContentView

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="BeHavDemo.MyView">
 <ContentView.Content>
     <StackLayout>
        <Label Text="xxxx"/>
        <Entry Text="eeeee" />
      </StackLayout>
  </ContentView.Content>
</ContentView>

Тогда я создаю поведение.

    public  class MyBeha : Behavior<MyView>
{
    protected override void OnAttachedTo(BindableObject view)
    {
        base.OnAttachedTo(view);

        var myview=view as MyView;
        StackLayout stackLayout = (StackLayout)myview.Content;

        Label label = (Label)stackLayout.Children[0];
       Entry entry=(Entry) stackLayout.Children[1];

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...