如果 ListView 中的某些控件存在验证错误,我在禁用一个按钮时会遇到一些问题。当我直接从 ListView 中的控件检查错误时,它对我有用。就像下面的代码一样:
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource MaterialDesignRaisedButton}">
<Setter Property="IsEnabled" Value="False" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=TextBoxName}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="True" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
并且控件具有:
<TextBox Name="TextBoxName"
m:HintAssist.Hint="Title"
m:HintAssist.IsFloating="True">
<TextBox.Text>
<Binding Mode="TwoWay" Path="Test.Item1.Name" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:NotEmptyValidationRule ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
所以这对我有用。但是当我想查看具有 6 个控件(文本框和组合框(的 ListView 内部时,我需要检查其中是否只有两个有错误。
如何查找列表视图中是否只有两个控件有错误?
PS:我正在使用MVVM模式。ListView具有ItemTemplate,DataTemplate和内部的控件,如TextBox和ComboBox:
<ListView Name="ListViewTests" HorizontalAlignment="Center" Grid.Row="1" ItemsSource="{Binding SelectedActiveTests}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="False">
<ListView.ItemTemplate>
<DataTemplate>
请帮忙,对不起我的英语不好...
的一种解决方案是使用命令。将RelayCommand
绑定到按钮时,如果CanExecute
返回false
,它会自动禁用。因此,您可以在命令的CanExecute
方法中进行验证。像这样:
MyCommand = new RelayCommand(arg => ExecuteCommandAction(), arg => IsValid())
更新
请注意,我使用Microsoft企业库进行验证!(https://msdn.microsoft.com/en-us/library/ff664451(v=pandp.50(.aspx(
定义检查验证错误的命令:
SaveAndCloseCommand = new RelayCommand(SaveAndCloseCommandExecute, arg => this.IsValid());
IsValid
是一个视图模型方法:
public bool IsValid()
{
var validator = ValidationFactory.CreateValidator<YourViewModel>();
return validator.Validate(this).IsValid;
}
绑定到您的按钮:
<Button x:Name="SaveAndCloseButton" Command="{Binding SaveAndCloseCommand}" />
您的视图模型必须包含经过验证的属性,如下所示:
[ValidatorComposition(CompositionType.And)]
[StringLengthValidator(1, 100)]
[RegexValidator(@"[^ ]")]
public string FirstName { ... }
文本字段如下所示:
<TextBox Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}"
vab:Validate.ValidatesOnTargetUpdated="True"
vab:Validate.BindingForProperty="Text" />
检查列表项的可能IsValid
方法:
public bool IsValid()
{
var allListItemsValid = myList.All(x => x.IsValid());
var validator = ValidationFactory.CreateValidator<YourViewModel>();
return validator.Validate(this).IsValid && allListItemsValid;
}
您的列表项应该是包含其验证的 ViewModels,因此您可以检查每个项是否有效。