C# 无法从WPF DataGrid单元格中删除错误状态

C# 无法从WPF DataGrid单元格中删除错误状态,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个使用WpfToolkit版本3.5.40128.1的WPF数据网格 对于一个单元格,我引发viewmodel具有侦听器的PropertyChanged事件,并确定该值是否复制到其他值。如果复制,则在对象上设置状态,并将单元格置于错误状态 因此,用户可以在第一条记录中输入优先级为2,在第二个字段中输入优先级为2,第二个值出错 当用户更改错误字段时,所有操作均按预期进行。 当用户将第一个“2”更改为1时,第二个字段将不再重复,标志将被清除。然而,无论我做什么,这个领域仍然是错误的。我尝试了以

我有一个使用WpfToolkit版本3.5.40128.1的WPF数据网格 对于一个单元格,我引发viewmodel具有侦听器的PropertyChanged事件,并确定该值是否复制到其他值。如果复制,则在对象上设置状态,并将单元格置于错误状态

因此,用户可以在第一条记录中输入优先级为2,在第二个字段中输入优先级为2,第二个值出错

当用户更改错误字段时,所有操作均按预期进行。 当用户将第一个“2”更改为1时,第二个字段将不再重复,标志将被清除。然而,无论我做什么,这个领域仍然是错误的。我尝试了以下方法:

1) 我在字段上添加了一个PropertyChanged事件调用,即使它位于ObservableCollection中。这导致定期检查重复值,但没有删除红色轮廓。 2) 我为ValidationErrors==true和ValidationErrors==false添加了事件样式。这听起来很有希望,但它只清除了工具提示,而没有清除红色轮廓。 3) 我在状态布尔值更改时添加了PropertyChanged调用

我自己在表单中手动处理字段,如果我进入和退出字段,它仍然是错误的。如果我输入字段并重新输入“2”,错误状态将消失

我现在不知道还能做什么!任何关于尝试其他事情的建议都会很有帮助

下面是datagrid的样式和定义。优先级是唯一要验证的字段

  <!-- 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链接实际上托管在堆栈溢出上的事实,这可能会向您暗示,这是快速获得问题正确答案的重要一步。你继续做你自己,伙计。祝你好运,祝你好运。