C# 无法从WPF DataGrid单元格中删除错误状态
我有一个使用WpfToolkit版本3.5.40128.1的WPF数据网格 对于一个单元格,我引发viewmodel具有侦听器的PropertyChanged事件,并确定该值是否复制到其他值。如果复制,则在对象上设置状态,并将单元格置于错误状态 因此,用户可以在第一条记录中输入优先级为2,在第二个字段中输入优先级为2,第二个值出错 当用户更改错误字段时,所有操作均按预期进行。 当用户将第一个“2”更改为1时,第二个字段将不再重复,标志将被清除。然而,无论我做什么,这个领域仍然是错误的。我尝试了以下方法: 1) 我在字段上添加了一个PropertyChanged事件调用,即使它位于ObservableCollection中。这导致定期检查重复值,但没有删除红色轮廓。 2) 我为ValidationErrors==true和ValidationErrors==false添加了事件样式。这听起来很有希望,但它只清除了工具提示,而没有清除红色轮廓。 3) 我在状态布尔值更改时添加了PropertyChanged调用 我自己在表单中手动处理字段,如果我进入和退出字段,它仍然是错误的。如果我输入字段并重新输入“2”,错误状态将消失 我现在不知道还能做什么!任何关于尝试其他事情的建议都会很有帮助 下面是datagrid的样式和定义。优先级是唯一要验证的字段C# 无法从WPF DataGrid单元格中删除错误状态,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个使用WpfToolkit版本3.5.40128.1的WPF数据网格 对于一个单元格,我引发viewmodel具有侦听器的PropertyChanged事件,并确定该值是否复制到其他值。如果复制,则在对象上设置状态,并将单元格置于错误状态 因此,用户可以在第一条记录中输入优先级为2,在第二个字段中输入优先级为2,第二个值出错 当用户更改错误字段时,所有操作均按预期进行。 当用户将第一个“2”更改为1时,第二个字段将不再重复,标志将被清除。然而,无论我做什么,这个领域仍然是错误的。我尝试了以
<!-- style to apply to DataGrid TextBlock -->
<Style x:Key="DataGridTextBlockStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="ToolTipService.ShowDuration"
Value="20000"/>
</Trigger>
<Trigger Property="Validation.HasError" Value="false">
<Setter Property="ToolTip"
Value=""/>
</Trigger>
</Style.Triggers>
</Style>
<!-- style to apply to DataGrid CheckBox -->
<Style x:Key="DataGridCheckBoxStyle" TargetType="{x:Type CheckBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="ToolTipService.ShowDuration"
Value="20000"/>
</Trigger>
<Trigger Property="Validation.HasError" Value="false">
<Setter Property="ToolTip"
Value=""/>
</Trigger>
</Style.Triggers>
</Style>
<!-- style to apply to DataGrid TextBox in edit mode -->
<Style x:Key="CellEditStyle" TargetType="{x:Type TextBox}">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="ToolTipService.ShowDuration"
Value="20000"/>
</Trigger>
<Trigger Property="Validation.HasError" Value="false">
<Setter Property="ToolTip"
Value=""/>
</Trigger>
</Style.Triggers>
</Style>
<!-- style to apply to DataGrid Checkbox in edit mode -->
<Style x:Key="CheckboxEditStyle" TargetType="{x:Type CheckBox}">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="ToolTipService.ShowDuration"
Value="20000"/>
</Trigger>
</Style.Triggers>
</Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="345*"/>
<ColumnDefinition Width="88*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<GroupBox Grid.Row="0" VerticalAlignment="Top"
Margin="2,2,2,0" Header="Region Selection"
BorderBrush="White" BorderThickness="0" Grid.ColumnSpan="2">
<Grid Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Vertical" Height="120"
VerticalAlignment="Top" Background="White">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Margin="5,5,5,5" Height="101" >
<wpftk:DataGrid x:Name="SegmentGrid"
IsEnabled="True"
AutoGenerateColumns="False"
VerticalScrollBarVisibility="Auto"
Height="90"
ItemsSource="{Binding SegmentList}" CanUserAddRows="False" CanUserDeleteRows="False" >
<wpftk:DataGrid.Columns>
<!-- The Region Name Column -->
<wpftk:DataGridTextColumn Header="Name"
Width="265"
Binding="{Binding RegionName}" />
<!-- The Priority Column -->
<wpftk:DataGridTemplateColumn Header="Priority" Width="60">
<wpftk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Style="{StaticResource DataGridTextBlockStyle}"
Text="{Binding Priority, Mode=TwoWay,
ValidatesOnDataErrors=True,
UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellTemplate>
<wpftk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox>
<TextBox.Text>
<Binding Path="Priority"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnDataErrors="True" >
</Binding>
</TextBox.Text>
<TextBox.Style>
<Style TargetType="TextBox" BasedOn="{StaticResource CellEditStyle}" />
</TextBox.Style>
</TextBox>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellEditingTemplate>
</wpftk:DataGridTemplateColumn>
<!-- The Write To Cartridge Column -->
<wpftk:DataGridTemplateColumn Header="Write To Cartridge" Width="80">
<wpftk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Style="{StaticResource DataGridCheckBoxStyle}"
IsChecked="{Binding WriteToCartridge, Mode=TwoWay,
ValidatesOnDataErrors=True,
UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellTemplate>
<wpftk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<CheckBox>
<CheckBox.IsChecked>
<Binding Path="WriteToCartridge"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnDataErrors="True"
ValidatesOnExceptions="True" >
</Binding>
</CheckBox.IsChecked>
<CheckBox.Style>
<Style TargetType="CheckBox" BasedOn="{StaticResource CheckboxEditStyle}" />
</CheckBox.Style>
</CheckBox>
</DataTemplate>
</wpftk:DataGridTemplateColumn.CellEditingTemplate>
</wpftk:DataGridTemplateColumn>
</wpftk:DataGrid.Columns>
</wpftk:DataGrid>
</ScrollViewer>
</StackPanel>
</Grid>
</GroupBox>
需要在对象内部为INotifyPropertyChanged公开一个新方法。
这允许我们检查数组中的所有对象,当我们更改值时,我们从对象而不是从viewmodel调用它。这会导致自动查找和清除阵列中复制的任何对象。在提问之前,您要做的第一件事是创建一个完全隔离您试图执行的操作,而不受其他代码的干扰。如果这并没有立即告诉您什么是错误的(这种情况经常发生,这是这样做的好处之一!),那么您可以使用此代码提问。没有任何代码,我们无法告诉你哪里出了问题。现在就去做,如果你仍然无法让它工作,那么你的问题可以添加进去。试着用一些WPF检查器(如WPF Snoop)检查单元格的
验证。错误。我认为仍然存在一个错误。另外,我强烈建议不要使用IDataErrorInfo
接口(验证与属性更改通知紧密绑定),而是使用INotifyDataErrorInfo
@Maxim。INotifyDataErrorInfo是在4.5中发布的,我们暂时还没有进入4.0框架。我们仍然受3.5的约束。@Will--这个问题完全合法,或者至少在过去几年里,我在这个论坛上撰写并回答了这个问题!!!!!!我指出了我的问题,并指出了我试图解决它。从来没有要求做一个“最小的、完整的和可验证的”示例。要求结束我的问题是愚蠢的。如果有人要求查看代码,我会很乐意添加代码。但是,美国政府不会付钱给我们,让我们在新的解决方案中编写代码,以便您可以复制和使用它。他们付钱给我们来编写解决方案并获得我们运行的问题的答案。好吧,完全忽略我为您提供的任何建议,完全忽略MCVE链接实际上托管在堆栈溢出上的事实,这可能会向您暗示,这是快速获得问题正确答案的重要一步。你继续做你自己,伙计。祝你好运,祝你好运。