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



设置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 Package 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.");
}
}

这段代码在我的测试回购中有效(请参阅我上面评论中的链接(:

<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"

假定按下Save按钮将产生调试输出;false";对于CCD_ 1。


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

请参阅ValidationFlags枚举。

您可能还希望包含, ValidateOnUnfocusing。当用户离开该控件(例如单击另一个控件(时,会再次进行检查。

最新更新