У меня есть список настроек, которые представляют собой сочетание типов (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 всегда равно нулю. Есть идеи?