Передача объекта в поведение в XAML не работает - PullRequest
1 голос
/ 02 октября 2019

У меня есть список настроек, которые представляют собой сочетание типов (int и string, url, ip-адрес и т. Д.), А параметры, которые позволяют их проверять, хранятся вместе с фактическим значением в объекте. Этот объект выбирается из списка настроек и передается на страницу сведений, где можно изменить значение.

На странице сведений у меня есть элемент управления Entry, который содержит значение, требующее проверки. Элемент Entry получает начальное значение из свойства SettingItem объекта ViewModel. Это работает нормально.

У меня есть поведение, которое я собираюсь использовать для проверки ввода пользователем значения на лету, однако, когда метод HandleTextChanged запущен, ItemToValidate имеет значение null. Я не могу понять, почему.

XAML:

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="DwyApp.Views.ItemDetailPage"
         xmlns:local="clr-namespace:DwyApp.Behaviours"
         Title="{Binding Title}">
<StackLayout Spacing="20" Padding="15">
    <Label Text="{Binding SettingItem.ParameterName}" FontSize="Medium" FontAttributes="Bold"/>
    <Entry Text="{Binding SettingItem.Value}" FontSize="Medium">
        <Entry.Behaviors>
            <local:ValidateBehaviour ItemToValidate="{Binding SettingItem}" />
        </Entry.Behaviors>
    </Entry>
    <Label x:Name="Value_Error" Text="{Binding SettingItem.ValidationMessage}" FontSize="Medium" IsVisible="{Binding SettingItem.ValidateValue}" TextColor="Red" />
    <Button Text="Save"
            VerticalOptions="Center"
            HorizontalOptions="Center"/>
    <Label Text="{Binding SettingItem.Description}" FontSize="Medium"/>
</StackLayout>

Поведение:

using DwyApp.Models;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using Xamarin.Forms;

namespace DwyApp.Behaviours
{
public class ValidateBehaviour:Behavior<Entry>

{

    public static readonly BindableProperty ItemToValidateProperty = BindableProperty.Create(nameof(ItemToValidate), 
                                                                                            typeof(SettingItem), 
                                                                                            typeof(ValidateBehaviour), 
                                                                                            defaultValue: null);

    public SettingItem ItemToValidate
    {
        get {
            return (SettingItem)GetValue(ItemToValidateProperty);
        }
        set {
            SetValue(ItemToValidateProperty, value);
        }
    }


    protected override void OnAttachedTo(Entry bindable)
    {
        bindable.TextChanged += HandleTextChanged;
        base.OnAttachedTo(bindable);
    }

    void HandleTextChanged(object sender, TextChangedEventArgs e)
    {
        bool IsValid = false;
    }

    protected override void OnDetachingFrom(Entry bindable)
    {
        bindable.TextChanged -= HandleTextChanged;
        base.OnDetachingFrom(bindable);
    }

}

}

Точка останова в HandleTextChanged всегда используется, но значение ItemToValidate всегда равно нулю. Есть идеи?

1 Ответ

4 голосов
/ 03 октября 2019

Измените свою привязку на что-то вроде этого:

<Entry x:Name="EntryValue" Text="{Binding SettingItem.Value}" FontSize="Medium">
    <Entry.Behaviors>
        <local:ValidateBehaviour                            
                ItemToValidate="{Binding BindingContext.SettingItem, Source={x:Reference EntryValue}}" />
    </Entry.Behaviors>
</Entry>

Как вы можете видеть, я добавил x:Name в Entry и использовал это значение, чтобы сообщить Binding в Behaviour, что будет его Source.

Надеюсь, это поможет .-

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