0

这个问题是我昨天在 SO 上发布的问题的后续问题。我已经按照安迪的建议使用INotifyDataErrorInfo. 我在Class昨天提到的模型类中使用了它。我在 C-SharpCorner.com 上找到了一篇文章,我也根据我的情况进行了调整。在将这些放置到位并对其进行测试后,我发现它确实捕获了范围限制。但是,它只用DataGrid红色圈出了问题所在的单元格。它没有显示单元格旁边的错误消息,这是我老板想要的。我想知道老板想要的东西是否在 WPF 中是不可能的DataGrid?还是我搞砸了?

HandleValidationResults我在上面第二个链接的方法中设置了一个断点。它正确地将错误消息分配给_errors集合。这是我修改的方法DataGridTextColumn

<DataGridTextColumn Header="Start" Binding="{Binding StartTime, StringFormat={}{0:0000}, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnNotifyDataErrors=True, UpdateSourceTrigger=PropertyChanged}">
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <StackPanel>
                <AdornedElementPlaceholder x:Name="dataGridTextColumn" />
                <ItemsControl ItemsSource="{Binding}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding ErrorContent}" Foreground="Red" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </ControlTemplate>
    </Validation.ErrorTemplate>
</DataGridTextColumn>
4

1 回答 1

0

不要直接设置验证错误模板,设置在ElementStyleor中EditingElementStyle

<DataGridTextColumn.ElementStyle>
   <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type TextBlock}}">
      <Setter Property="Validation.ErrorTemplate">
         <Setter.Value>
            <ControlTemplate>
               <StackPanel>
                  <AdornedElementPlaceholder x:Name="dataGridTextColumn" />
                  <ItemsControl ItemsSource="{Binding}">
                     <ItemsControl.ItemTemplate>
                        <DataTemplate>
                           <TextBlock Text="{Binding ErrorContent}" Foreground="Red" />
                        </DataTemplate>
                     </ItemsControl.ItemTemplate>
                  </ItemsControl>
               </StackPanel>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>
</DataGridTextColumn.ElementStyle>

带有遮挡错误模板的 DataGrid。

但是,您会注意到您当前的方法效果不佳,因为错误模板将遮挡错误单元格下方的其他单元格。更好的选择是将错误模板设置为ToolTip. 这样,如果您将鼠标悬停在错误的单元格上,错误将显示为弹出窗口。

<DataGridTextColumn.ElementStyle>
   <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type TextBlock}}">
      <Style.Triggers>
         <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="ToolTip">
               <Setter.Value>
                  <ToolTip DataContext="{Binding PlacementTarget.(Validation.Errors), RelativeSource={RelativeSource Self}}">
                     <ItemsControl ItemsSource="{Binding }">
                        <ItemsControl.ItemTemplate>
                           <DataTemplate>
                              <TextBlock Text="{Binding ErrorContent}" Foreground="Red" />
                           </DataTemplate>
                        </ItemsControl.ItemTemplate>
                     </ItemsControl>
                  </ToolTip>
               </Setter.Value>
            </Setter>
         </Trigger>
      </Style.Triggers>
   </Style>
</DataGridTextColumn.ElementStyle>

带有错误工具提示的 DataGrid 列。

于 2021-03-17T09:17:40.357 回答