XAML,当列表视图中的控件中存在一些错误时禁用按钮



如果 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,因此您可以检查每个项是否有效。

最新更新