gpt4 book ai didi

c# - GridView 验证将整行标记为无效,而不仅仅是单元格

转载 作者:行者123 更新时间:2023-12-05 06:21:21 26 4
gpt4 key购买 nike

问题

我已经使用 INotifyDataErrorInfo 接口(interface)实现了验证。我的问题是,不是仅将网格中的单元格显示为无效并将其标记为红色,而是将整行标记为红色。当 GridView 有很多行时,每一行都有无效的单元格,它看起来不太好,很难看出什么是无效的。我正在使用 WPF Telerik 库中的 RadGridView。

如何只将单元格标记为红色而不是整行?

问题的可视化

在下图中,如果单元格的值为“String-1.2”,则它是无效的。该单元格显示为无效,但整行都标有红色,而不仅仅是该单元格。 enter image description here

源代码

此类代表我的 GridView 中的一个单元格:

public class ShowQueueCellValue : INotifyPropertyChanged, INotifyDataErrorInfo
{
...
public object Value
{
get => this.value;
set
{
bool hasChanged = value != this.value;
this.value = value;
...
}
}
public List<ShowQueueCellValue> GridRow { get; set; }

public string ErrorMessage
{
get => this.errorMessage;
set
{
this.errorMessage = value;
IsValid = string.IsNullOrWhiteSpace(value) || value == "0";
}
}

public bool IsValid
{
get => this.isValid;
set
{
if (value != this.isValid)
{
this.isValid = value;
OnErrorsChanged(nameof(Value));
this.viewModel.OkCommand.RaiseCanExecuteChanged();
}
}
}
public IEnumerable GetErrors(string propertyName)
{
if (!IsValid && propertyName == nameof(Value))
{
yield return ErrorMessage;
}
}

public bool HasErrors => !IsValid;

public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

public void OnErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

最佳答案

虽然我意识到这是一个旧线程,但它是我在尝试解决这个完全相同的问题时能够找到的唯一线程。我还没有在其他任何地方找到它的地址。所以,由于我和我的同事找到了一种至少可以阻止所有细胞变红的方法,所以我将发布该解决方案。

在我的资源字典中,我定义了以下样式,它们大部分只是 Telerik 验证样式的副本(我将在最后显示更改的部分):

<ControlTemplate x:Key="NoValidationBackground" TargetType="telerik:GridViewCell">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected"/>
<VisualState x:Name="Selected">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background_Selected" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="SelectedUnfocused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="Background_SelectedUnfocused" Storyboard.TargetProperty="(UIElement.Visibility)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="Current">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background_Current" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="MouseOver">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background_Over" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="EditingStates">
<VisualState x:Name="Edited">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_ContentPresenter" Storyboard.TargetProperty="Margin">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Thickness>0</Thickness>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_ContentPresenter" Storyboard.TargetProperty="VerticalAlignment">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<VerticalAlignment>Stretch</VerticalAlignment>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_CellBorder" Storyboard.TargetProperty="Background">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{telerik:Office2013Resource ResourceKey=MainBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Display"/>
</VisualStateGroup>
<VisualStateGroup x:Name="DisabledStates">
<VisualState x:Name="Enabled"/>
<VisualState x:Name="Disabled">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="PART_ContentPresenter" Storyboard.TargetProperty="Opacity">
<DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="{telerik:Office2013Resource ResourceKey=DisabledOpacity}"/>
</DoubleAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background_Disabled" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="ValueStates">
<VisualState x:Name="CellValid"/>
<VisualState x:Name="CellInvalid">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background_Invalid" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="CellInvalidUnfocused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background_Invalid_Unfocused" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="HighlightStates">
<VisualState x:Name="NotHighlighted"/>
<VisualState x:Name="Highlighted">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="PART_CellBorder" Storyboard.TargetProperty="Background">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource GridViewCell_HightlightedBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="PART_CellBorder"
Background="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}"
BorderBrush="{TemplateBinding VerticalGridLinesBrush}"
BorderThickness="{Binding VerticalGridLinesWidth, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource GridLineWidthToThicknessConverter}, ConverterParameter=Right}"
Margin="0 0 0 1"/>
<Border x:Name="Background_SelectedUnfocused"
Grid.Column="2"
Grid.ColumnSpan="2"
Background="{telerik:Office2013Resource ResourceKey=AccentMainBrush}"
Opacity="0.28"
Visibility="Collapsed"/>
<Border x:Name="Background_Over"
BorderBrush="{TemplateBinding VerticalGridLinesBrush}"
Margin="0 0 0 1"
BorderThickness="{Binding VerticalGridLinesWidth, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource GridLineWidthToThicknessConverter}, ConverterParameter=Right}"
Grid.Column="2"
Grid.ColumnSpan="2"
Visibility="Collapsed"
Background="{TemplateBinding MouseOverBackground}"/>
<Border x:Name="Background_Selected"
BorderBrush="{TemplateBinding VerticalGridLinesBrush}"
Margin="0 0 0 1"
BorderThickness="{Binding VerticalGridLinesWidth, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource GridLineWidthToThicknessConverter}, ConverterParameter=Right}"
Grid.Column="2"
Grid.ColumnSpan="2"
Visibility="Collapsed"
Background="{TemplateBinding SelectedBackground}"/>
<Border x:Name="Background_Invalid_Unfocused" Margin="0 0 1 1" Background="White" Grid.Column="2" Grid.ColumnSpan="2"/>
<Border x:Name="Background_Current"
BorderThickness="1"
Grid.Column="2"
Grid.ColumnSpan="2"
Visibility="Collapsed"
Margin="0 0 1 1"
BorderBrush="{TemplateBinding CurrentBorderBrush}"/>
<!--The background property of this item controls the background of any cell that contains an invalid property value-->
<Border x:Name="Background_Invalid"
Background="{telerik:Office2013Resource ResourceKey=MainBrush}"
BorderBrush="{telerik:Office2013Resource ResourceKey=ValidationBrush}"
BorderThickness="1"
Grid.Column="2"
Grid.ColumnSpan="2"
Visibility="Collapsed">
<ToolTipService.ToolTip>
<ToolTip x:Name="validationTooltip" Placement="Right" Content="{TemplateBinding Errors}" Template="{StaticResource GridViewCell_ValidationToolTipTemplate}"/>
</ToolTipService.ToolTip>
<!--This item controls the corner triangle in a invalid cell which is not selected-->
<Grid Height="22" HorizontalAlignment="Right" Margin="0 -1 -1 0" Width="22" VerticalAlignment="Top">
<Path
Data="M0,0 L10,0 10,10 z"
Fill="{telerik:Office2013Resource ResourceKey=ValidationBrush}"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Width="10"
Height="10"
Stretch="Fill"/>
</Grid>
</Border>
<Border x:Name="Background_Disabled" Background="{telerik:Office2013Resource ResourceKey=MainBrush}" Opacity="0.5" Grid.Column="2" Grid.ColumnSpan="2" Visibility="Collapsed"/>
<ContentPresenter x:Name="PART_ContentPresenter"
Margin="{TemplateBinding Padding}"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ParentRow.HorizontalGridLinesWidth}" Value="0">
<Setter TargetName="PART_CellBorder" Property="Margin" Value="0"/>
<Setter TargetName="Background_Current" Property="Margin" Value="0 0 1 0"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ParentRow.DetailsVisibility}" Value="Visible">
<Setter TargetName="PART_CellBorder" Property="Margin" Value="0"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ParentRow.VerticalGridLinesWidth}" Value="0">
<Setter TargetName="Background_Current" Property="Margin" Value="0 0 0 1"/>
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=ParentRow.HorizontalGridLinesWidth}" Value="0"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=ParentRow.VerticalGridLinesWidth}" Value="0"/>
</MultiDataTrigger.Conditions>
<Setter TargetName="Background_Current" Property="Margin" Value="0"/>
</MultiDataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="CellNoValidationBackground" TargetType="telerik:GridViewCell">
<Setter Property="Template" Value="{StaticResource NoValidationBackground}"/>
<Setter Property="Padding" Value="5 0"/>
<Setter Property="BorderThickness" Value="0 0 1 0"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisualStyle}"/>
<Setter Property="SelectedBackground" Value="{telerik:Office2013Resource ResourceKey=EffectAccentHighBrush}"/>
<Setter Property="CurrentBorderBrush" Value="{telerik:Office2013Resource ResourceKey=AccentMainBrush}"/>
<Setter Property="MouseOverBackground" Value="{telerik:Office2013Resource ResourceKey=EffectAccentLowBrush}"/>
</Style>
<Style TargetType="telerik:GridViewCell" BasedOn="{StaticResource CellNoValidationBackground}"/>

我改变的部分是这一行:

<Border x:Name="Background_Invalid_Unfocused" Margin="0 0 1 1" Background="White" Grid.Column="2" Grid.ColumnSpan="2"/>

以前,它的可见性属性设置为折叠。这将导致整行都显示粉红色,除非您正在编辑它,否则它会折叠粉红色以显示白色。显然,您可以在其中使用任何您想要的颜色。

关于c# - GridView 验证将整行标记为无效,而不仅仅是单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59844451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com