在访问View Model的数据网格中进行验证?

时间:2017-07-19 16:07:31

标签: c# wpf validation wpfdatagrid wpftoolkit

我一直在研究这个问题差不多3天了。搜索还没有发现。问题看起来像他们会回答我的问题但最终会变成完全不同的东西。所以这里:

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

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

我的资源字典定义:

<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>

        

优先级字段是唯一被验证的字段,但我有一个错误的时间来验证它。我发现的所有东西(在优先级设置器中进行验证,在自定义验证器类中进行验证)都进行了无法访问DataContext对象的独立验证。

有没有人知道如何获取对DataContext的访问权限或指向我的类中的方法来进行其中的验证?我尝试在我的DataContext类中继承IDataErrorInfo接口,但是DataGrid单元格并没有调用它。

1 个答案:

答案 0 :(得分:0)

嗯,花了一点时间让事情发挥作用,但这是我实施的内容:

在数据对象中,我实现了INotifyPropertyChanged,当优先级字段被更改时,我通知侦听器更改。

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

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

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