显示验证错误的工具提示适用于绑定到POCO的TextBlock,但不适用于POCO内的Property。为什么?

时间:2018-12-07 00:00:23

标签: c# wpf xaml binding

在我的WPF MVVM项目中,我使用INotifyDataErrorinfo处理DataGrid中的验证。因此,我可以在“操作员”列中成功设置错误单元的样式:

    <DataGridTemplateColumn Header="Operator" Width="140">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Operator}">
                        <TextBlock.Style>
                            <Style TargetType="TextBlock">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding OperatorId, Converter={StaticResource IsOperatorIdNullConverter}}" Value="False">
                                        <Setter Property="FontWeight" Value="Bold"/>
                                    </DataTrigger>
                                    <Trigger Property="Validation.HasError" Value="true">
                                        <Setter Property="ToolTip">
                                            <Setter.Value>
                                                <ToolTip DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget}">
                                                    <ItemsControl ItemsSource="{Binding Path=(Validation.Errors)}" DisplayMemberPath="ErrorContent"/>
                                                </ToolTip>
                                            </Setter.Value>
                                        </Setter>
                                        <Setter Property="Background" Value="Salmon"/>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
                </StackPanel>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <Grid>
                    <controls:AutoCompleteBox Text="{Binding Operator, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
                                              ItemsSource="{Binding Path=Data.OperatorNames, Source={StaticResource proxy}}"
                                              IsTextCompletionEnabled="True"
                                              FilterMode="Contains"
                                              MinimumPrefixLength="3"/>
                </Grid>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>

但是在我的“ OperatorType”列中,这种相同的技术不起作用。正在检测到错误,并显示了系统默认错误样式,但没有显示我的自定义样式。代码是:

<DataGridTemplateColumn Header="Operator type" Width="140">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding OperatorType.OperatorTypeName}">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <Trigger Property="Validation.HasError" Value="true">
                                <Setter Property="ToolTip">
                                    <Setter.Value>
                                        <ToolTip DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget}">
                                            <ItemsControl ItemsSource="{Binding Path=(Validation.Errors)}" DisplayMemberPath="ErrorContent"/>
                                        </ToolTip>
                                    </Setter.Value>
                                </Setter>
                                <Setter Property="Background" Value="Salmon"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <Grid>
                <controls:AutoCompleteBox ItemsSource="{Binding Path=Data.OperatorTypeNames, Source={StaticResource proxy}}"
                                          ItemTemplate="{StaticResource AutoCompleteBoxItemOperatorTypeTemplate}"
                                          SelectedItem="{Binding OperatorType, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
                                          ValueMemberPath="OperatorTypeName"
                                          IsTextCompletionEnabled="True"
                                          FilterMode="Contains"
                                          MinimumPrefixLength="3"/>
            </Grid>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

据我所知,唯一的区别是:

  1. “ Operator”中的文本使用绑定到POCO(操作员),而“ OperatorType”中的文本绑定到POCO属性(OperatorType.OperatorTypeName)
  2. AutoCompleteBox声明略有不同

我已经为ToolTip DataContext尝试了许多设置,但似乎无济于事。

问题

要使“ OperatorType”自定义错误样式生效,我需要更改什么?

1 个答案:

答案 0 :(得分:0)

嗯,这是一段旅程,但是解决方案是在TextBlock上设置DataContext:

<TextBlock DataContext="{Binding OperatorType}" Text="{Binding OperatorTypeName}">

这会使触发器指向OperatorType POCO,而框中的文本取自OperatorType.OperatorTypeName。