设置 BindingContext 时,Xamarin Community Toolkit 输入验证为真

Xamarin Community Toolkit input validation is true when BindingContext is set

设置 BindingContext 后,即使所需参数不正确,IsValid 也会将 IsLastnameValid 和 IsFirstnameValid 设置为 true。我不明白为什么。

XMAL代码

<StackLayout>
    <Entry Placeholder="Lastname" Text="{Binding Lastname}">
        <Entry.Behaviors>
            <xct:TextValidationBehavior MinimumLength="3" MaximumLength="10"
                IsValid="{Binding IsLastnameValid}"/>
        </Entry.Behaviors>
    </Entry>

    <Entry Placeholder="Firstname" Text="{Binding Firstname}">
        <Entry.Behaviors>
            <xct:TextValidationBehavior MinimumLength="3" MaximumLength="10"
                IsValid="{Binding IsFirstnameValid}"/>
        </Entry.Behaviors>
    </Entry>

    <Button Text="Save" Clicked="OnSave">
        <Button.IsEnabled>
            <MultiBinding  Converter="{StaticResource BooleanAndConverter}">
                <Binding Path="IsLastnameValid"/>
                <Binding Path="IsFirstnameValid"/>
            </MultiBinding>
        </Button.IsEnabled>
    </Button>
</StackLayout>

CS 码

public partial class MainPage : ContentPage
{
    private UserViewModel _userViewModel;

    public MainPage()
    {
        InitializeComponent();
        _userViewModel = new UserViewModel(false, false);
        BindingContext = _userViewModel;
    }

    private void OnSave(object sender, EventArgs e)
    {
        Console.WriteLine("[User View Model Firstname] : " + _userViewModel.Firstname + "  " + _userViewModel.IsFirstnameValid);
        Console.WriteLine("[User View Model Lastname] : " + _userViewModel.Lastname + "  " + _userViewModel.IsLastnameValid);
    }
}

ViewModel 代码 我正在使用 Nuget 包 PropertyChanged.Fody

[AddINotifyPropertyChangedInterface]
public class UserViewModel
{
    public UserViewModel(bool isLastnameValid, bool isFirstnameValid)
    {
        IsLastnameValid = isLastnameValid;
        IsFirstnameValid = isFirstnameValid;
    }

    public string Lastname { get; set; }
    public string Firstname { get; set; }
    public bool IsLastnameValid { get; set; }
    public bool IsFirstnameValid { get; set; }
}

感谢您的帮助:)

已编辑以显示转换器代码

public class BooleanAndConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {

        if (values.Any(value => value == null))
        {
            return false;
        }

        var result = values.OfType<IConvertible>().All(System.Convert.ToBoolean);
        return result;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("BooleanAndConverter is a OneWay converter.");
    }
}

此代码在我的测试回购中有效(请参阅我上面评论中的 link):

<Entry Placeholder="Lastname" Text="{Binding Lastname}">
    <Entry.Behaviors>
        <xct:TextValidationBehavior MinimumLength="3" MaximumLength="10"
         Flags="ValidateOnAttaching, ValidateOnValueChanging" IsValid="{Binding IsLastnameValid}"/>
    </Entry.Behaviors>
</Entry>

与你的唯一不同的是增加了属性

Flags="ValidateOnAttaching, ValidateOnValueChanging"

鉴于此,按下“保存”按钮会导致 IsValid 的调试输出为“false”。


EDITTED:如果您手动设置标志,则默认标志不适用。所以需要列出所有需要的标志。我已经更改了上面的代码片段。

参见 ValidationFlags enum

您可能还想包括 , ValidateOnUnfocusing。这会在用户离开该控件时再次检查(例如,单击另一个控件)。