设置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
。当用户离开该控件(例如单击另一个控件(时,会再次进行检查。