2

私のWPFアプリケーションには、アイテムのObservableCollectionがあります。各アイテムには一意の名前が必要であり、アイテムの名前は文字で始まる必要があります。IDataErrorInfoを実装する基本クラスのデータ検証エラーをチェックします。問題は、ユーザーが既存の名前を入力すると、楕円と「!」が表示されることです。記号は2行ではなく1行にのみ表示されますが、両方に検証エラーがあります。これが私のDataGridのコードです。

    <DataGrid ItemsSource="{Binding Path=IconManagerModel.ConfigurationIcons, 
                             ValidatesOnDataErrors=True}" x:Name="IconsData">
        <DataGrid.Resources>
            <Style x:Key="errorStyle" TargetType="{x:Type TextBlock}" >
                <Setter Property="Padding" Value="2"/>
                <Style.Triggers>
    //Error style for names which not starts with letter
                    <Trigger Property="Validation.HasError" Value="True">
                        <Setter Property="Background" Value="Red"/>
                        <Setter Property="ToolTip" Value="{Binding RelativeSource=
                                RelativeSource FindAncestor, 
                                AncestorType={x:Type DataGridRow}}, 
                                Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>
    //Error style for duplicated names
                    <DataTrigger Binding="{Binding IsDuplicated}" Value="True">
                        <Setter Property="Background" Value="Red"/>
                        <Setter Property="ToolTip" Value="Duplicated Name" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            <Style x:Key="ErrorEditStyle" TargetType="{x:Type TextBox}">
                <Setter Property="Padding" Value="2"/>
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="True">
                        <Setter Property="Background" Value="Red"/>
                        <Setter Property="ToolTip" 
                                Value="{Binding RelativeSource=
                                {RelativeSource FindAncestor,
                                AncestorType={x:Type DataGridRow}}, 
                                Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>                
                </Style.Triggers>
            </Style>
        </DataGrid.Resources>
        <DataGrid.RowValidationErrorTemplate>
            <ControlTemplate>
//This template applies only for the row that has been edited. 
//Other row with the same IconId keeps default style
                <Grid ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, 
                AncestorType={x:Type DataGridRow}}, 
                Path=(Validation.Errors)[0].ErrorContent}" >
                    <Ellipse StrokeThickness="0" Fill="Red"
                                        Width="{TemplateBinding FontSize}" 
                                        Height="{TemplateBinding FontSize}">
                    </Ellipse>
                    <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" 
                                        FontWeight="Bold" Foreground="White" 
                                        HorizontalAlignment="Center"/>
                </Grid>
            </ControlTemplate>
        </DataGrid.RowValidationErrorTemplate>
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Icon Name">
            </DataGridTemplateColumn>
            <DataGridTextColumn  ElementStyle="{StaticResource ResourceKey=errorStyle}" 
                EditingElementStyle="{StaticResource ResourceKey=ErrorEditStyle}" 
                            Binding="{Binding IconId, ValidatesOnDataErrors=True,
                            NotifyOnValidationError=True,
                            UpdateSourceTrigger=PropertyChanged}"/>
        </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

前もって感謝します。

4

0 に答える 0