我有多个控件,包括一个文本框和一个组合框,我希望它们都能显示一条工具提示,其中包含在Validation.Errors集合中包含的所有错误。如果可能的话,我希望它们都共享一个公共样式,这就是我正在尝试的。我相信我在ToolTip setter中的绑定方面做错了什么,但我无法找出问题所在。在我的INotifyDataErrorInfo实现中返回一个错误对象,指定错误的严重程度(错误或警告)。
我想要一个适用于窗口中所有控件的样式,该样式将显示包含该控件的所有错误和警告列表的工具提示。错误应以红色显示,警告应以黄色显示。以下是我想出的样式:
我尝试将RelativeSource更改为搜索AncestorLevel 1和2的控件类型,但似乎都不起作用。我基于一个ControlTemplate创建了样式,该样式与我想要在控件本身上显示的ToolTip完全相同:它根据错误严重性显示红色或黄色边框,并显示一个ToolTip。我确定这与我的绑定有关,因为ErrorTemplate自动将其DataContext设置为Validation.Errors集合,这使得很容易将ItemsSource绑定到ItemsCollection。但是样式的ToolTip没有这种运气。这是我用于我的ErrorTemplate的工作ControlTemplate:
我想要一个适用于窗口中所有控件的样式,该样式将显示包含该控件的所有错误和警告列表的工具提示。错误应以红色显示,警告应以黄色显示。以下是我想出的样式:
<Style TargetType="FrameworkElement">
<Setter Property="ToolTip">
<Setter.Value>
<ItemsControl ItemsSource="{Binding Path=(Validation.Errors), RelativeSource={RelativeSource Self}}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ErrorContent.ErrorMessage}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ErrorContent.ErrorSeverity}"
Value="{x:Static local:ErrorType.Warning}">
<Setter Property="Foreground" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=(Validation.HasError)}" Value="True">
<Setter Property="ToolTip">
<Setter.Value>
<ItemsControl ItemsSource="{Binding Path=(Validation.Errors)}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ErrorContent.ErrorMessage}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ErrorContent.ErrorSeverity}"
Value="{x:Static local:ErrorType.Warning}">
<Setter Property="Foreground" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
我尝试将RelativeSource更改为搜索AncestorLevel 1和2的控件类型,但似乎都不起作用。我基于一个ControlTemplate创建了样式,该样式与我想要在控件本身上显示的ToolTip完全相同:它根据错误严重性显示红色或黄色边框,并显示一个ToolTip。我确定这与我的绑定有关,因为ErrorTemplate自动将其DataContext设置为Validation.Errors集合,这使得很容易将ItemsSource绑定到ItemsCollection。但是样式的ToolTip没有这种运气。这是我用于我的ErrorTemplate的工作ControlTemplate:
<ControlTemplate x:Key="ErrorTemplate">
<Border BorderThickness="1">
<AdornedElementPlaceholder Name="ElementPlaceholder"/>
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="Red"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ElementPlaceholder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent.ErrorSeverity}"
Value="{x:Static local:ErrorType.Warning}">
<Setter Property="BorderBrush" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Border.ToolTip>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ErrorContent.ErrorMessage}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ErrorContent.ErrorSeverity}"
Value="{x:Static local:ErrorType.Warning}">
<Setter Property="Foreground" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border.ToolTip>
</Border>
</ControlTemplate>
有人能给我一些建议吗?