在访问视图模型的数据网格中进行验证?

Validation in a datagrid accessing the View Model?

我已经研究这个问题将近 3 天了。搜索还没有找到任何结果。这些问题看起来会回答我的问题,但最终却完全不同。所以这里是:

我有一个绑定到视图模型的视图。在视图中,我有一个 DataGrid,它由视图模型中的列表填充。我们的标准是在字段将以红色突出显示并且工具提示包含错误消息的情况下进行数据错误验证。根据我在 DataGrid 中阅读的内容,我需要在 属性 级别的 class 定义中执行验证。

验证正在查看输入的值是否已存在于 DataGrid 的项目列表中,这在视图模型中是有帮助的。我无法弄清楚如何从我的 class 定义中获取视图模型的可寻址性。

我的资源字典定义:

<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>
</Style.Triggers>

我的数据网格定义:

        <wpftk:DataGrid x:Name="SegmentGrid"
          IsEnabled="True"      
          AutoGenerateColumns="False" 
          VerticalScrollBarVisibility="Auto" 
          Height="90" 
          ItemsSource="{Binding SegmentList}" 
          CanUserAddRows="False" CanUserDeleteRows="False" >
          <event:EventCommandBehavior.EventCommands>
              <event:EventCommand 
                 RoutedEvent="wpftk:DataGrid.SelectionChanged" 
                   Command="{Binding RegionSelectionChanged}"/>
              </event:EventCommandBehavior.EventCommands>
              <wpftk:DataGrid.Columns>
                  <wpftk:DataGridTextColumn Header="Name" 
                       Width="265" 
                       Binding="{Binding RegionName}" />
                                  <!--  The Priority Column -->
            <wpftk:DataGridTemplateColumn Header="Priority" Width="80">
              <wpftk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <TextBlock Style="{StaticResource DataGridTextBlockStyle}" 
                         Text="{Binding Priority, Mode=TwoWay,  
                           ValidatesOnDataErrors=True, 
                           ValidatesOnExceptions=True,
                           UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
              </wpftk:DataGridTemplateColumn.CellTemplate>
              <wpftk:DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                  <TextBox>
                    <TextBox.Text>
                      <Binding Path="Priority"  
                           UpdateSourceTrigger="PropertyChanged" 
                           ValidatesOnDataErrors="True" 
                           ValidatesOnExceptions="True">
                      </Binding>
                    </TextBox.Text>
                    <TextBox.Style>
                      <Style TargetType="TextBox" BasedOn="{StaticResource CellEditStyle}" />
                    </TextBox.Style>
                  </TextBox>
                </DataTemplate>
              </wpftk:DataGridTemplateColumn.CellEditingTemplate>
            </wpftk:DataGridTemplateColumn>
                  <wpftk:DataGridCheckBoxColumn Header="Write To Cartridge"
                       Binding="{Binding WriteToCartridge, Mode=TwoWay}"/>
              </wpftk:DataGrid.Columns>
      </wpftk:DataGrid>
    </StackPanel>

“优先级”字段是唯一经过验证的字段,但我在验证它时遇到了麻烦。我发现的所有内容(在 Priority setter 中进行验证,在自定义验证器 class 中进行验证)都进行独立验证,无法访问 DataContext 对象。

有谁知道获取 DataContext 访问权限或指向我的 class 中的方法以在其中进行验证的方法吗?我尝试在我的 DataContext class 中继承 IDataErrorInfo 接口,但 DataGrid 单元格从未调用过它。

好吧,我花了一些时间才开始工作,但这是我实现的:

在数据对象中,我实现了 INotifyPropertyChanged,当 Priority 字段发生变化时,我将变化通知监听器。

在视图模型中:我实现了为 PropertyChanged 事件设置侦听器的逻辑,如果该值已经存在于区域列表中,我在对象中设置一个布尔值,指示它处于重复状态。

最后在数据对象中我实现了 IDataErrorInfo 接口,如果 propertyName 是 Priority 并且布尔值是 true 那么我 return 我的自定义错误。

所有管道就位后第一次工作!