设置 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:如果您手动设置标志,则默认标志不适用。所以需要列出所有需要的标志。我已经更改了上面的代码片段。
您可能还想包括 , ValidateOnUnfocusing
。这会在用户离开该控件时再次检查(例如,单击另一个控件)。
设置 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:如果您手动设置标志,则默认标志不适用。所以需要列出所有需要的标志。我已经更改了上面的代码片段。
您可能还想包括 , ValidateOnUnfocusing
。这会在用户离开该控件时再次检查(例如,单击另一个控件)。