我一直在研究这个问题差不多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单元格并没有调用它。
答案 0 :(得分:0)
嗯,花了一点时间让事情发挥作用,但这是我实施的内容:
在数据对象中,我实现了INotifyPropertyChanged,当优先级字段被更改时,我通知侦听器更改。
在视图模型中:我实现了为PropertyChanged事件设置侦听器的逻辑,如果值已经存在于区域列表中,我在对象中设置了一个布尔值,表明它处于重复状态。
最后在数据对象中我实现了IDataErrorInfo接口,如果propertyName是Priority并且Boolean是true,那么我返回自定义错误。
所有管道到位后第一次工作!