WPF 验证错误模板错误内容工具提示不起作用
WPF Validation ErrorTemplate errorcontent tooltip not working
我不确定我是否遗漏了一些简单的东西。我在想也许绑定需要改变?或者它可能没有正确定位 ErrorContent 的文本框?
我认为值得注意的是,这两个示例都没有产生绑定错误。
如果我在 App.xml 中定义了以下 XAML,当我的字段被验证时,一切看起来都应该正常工作,但工具提示不起作用,因为 ErrorContent 似乎是空白的,如果我将工具提示中的绑定更改为“测试”,则工具提示会显示“测试”。
<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="TextBox">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<Image
Height="24"
Margin="-28,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
DockPanel.Dock="Right"
Source="/Resources/error-96.png"
ToolTip="{Binding /ErrorContent}" />
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果我向同一个 XAML 添加一些触发器来设置边框颜色等,工具提示就会神奇地开始工作,如下所示。
<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border
x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="True"
UseLayoutRounding="True">
<ScrollViewer
x:Name="PART_ContentHost"
Focusable="false"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Trigger.Setters>
<Setter Property="BorderBrush" Value="Red" />
<Setter Property="BorderThickness" Value="3" />
</Trigger.Setters>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Validation.HasError" Value="false" />
<Condition Property="IsMouseOver" Value="true" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" />
</MultiTrigger.Setters>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="border" Property="Opacity" Value="0.56" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<Image
Height="24"
Margin="-28,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
DockPanel.Dock="Right"
Source="/Resources/error-96.png"
ToolTip="{Binding /ErrorContent}" />
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果您想查看用于显示 ErrorTemplate 的文本框绑定。
<TextBox
Margin="0,2.5,2.5,2.5"
HorizontalAlignment="Stretch"
ui:ControlHelper.PlaceholderText="IPv4 Address"
ui:TextBoxHelper.IsDeleteButtonVisible="False"
Text="{Binding EditServerModel.IPAddress, ValidatesOnDataErrors=True}" />
我不想使用第二个的主要原因是它替换了 DefaultTextBoxStyle 的模板并破坏了文本框中的占位符文本,以及其他一些特殊功能,我真正 want/need 是显示带有工具提示的错误图像的部分。
编辑:
我正在使用 CommunityToolkit.MvvM。我的模型实现了 ObservableValidator,它实现了 INotifyDataErrorInfo。我模型中的属性使用 DataAnnotation 属性,例如 [Required]
和 [RegularExpression]
一个例子:
public class ServerModel : ObservableValidator
{
private string _iPAddress;
[Required]
[RegularExpression(@"^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$", ErrorMessage = "Not a valid IPv4 address.")]
public string IPAddress
{
get => _iPAddress;
set
{
SetProperty(ref _iPAddress, value);
ValidateProperty(value);
}
}
}
编辑 - 工作答案:
我最终从 ModernWpf 项目中复制了默认样式并删除了 primitives:ValidationHelper.IsTemplateValidationAdornerSite="True"
,以便我可以使用自己的验证模板。
试试这个绑定:
ToolTip="{Binding [0].ErrorContent}"
如果这不起作用,问题与 DefaultTextBoxStyle
.
有关
我不确定我是否遗漏了一些简单的东西。我在想也许绑定需要改变?或者它可能没有正确定位 ErrorContent 的文本框?
我认为值得注意的是,这两个示例都没有产生绑定错误。
如果我在 App.xml 中定义了以下 XAML,当我的字段被验证时,一切看起来都应该正常工作,但工具提示不起作用,因为 ErrorContent 似乎是空白的,如果我将工具提示中的绑定更改为“测试”,则工具提示会显示“测试”。
<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="TextBox">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<Image
Height="24"
Margin="-28,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
DockPanel.Dock="Right"
Source="/Resources/error-96.png"
ToolTip="{Binding /ErrorContent}" />
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果我向同一个 XAML 添加一些触发器来设置边框颜色等,工具提示就会神奇地开始工作,如下所示。
<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border
x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
SnapsToDevicePixels="True"
UseLayoutRounding="True">
<ScrollViewer
x:Name="PART_ContentHost"
Focusable="false"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Trigger.Setters>
<Setter Property="BorderBrush" Value="Red" />
<Setter Property="BorderThickness" Value="3" />
</Trigger.Setters>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Validation.HasError" Value="false" />
<Condition Property="IsMouseOver" Value="true" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" />
</MultiTrigger.Setters>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="border" Property="Opacity" Value="0.56" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<Image
Height="24"
Margin="-28,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
DockPanel.Dock="Right"
Source="/Resources/error-96.png"
ToolTip="{Binding /ErrorContent}" />
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果您想查看用于显示 ErrorTemplate 的文本框绑定。
<TextBox
Margin="0,2.5,2.5,2.5"
HorizontalAlignment="Stretch"
ui:ControlHelper.PlaceholderText="IPv4 Address"
ui:TextBoxHelper.IsDeleteButtonVisible="False"
Text="{Binding EditServerModel.IPAddress, ValidatesOnDataErrors=True}" />
我不想使用第二个的主要原因是它替换了 DefaultTextBoxStyle 的模板并破坏了文本框中的占位符文本,以及其他一些特殊功能,我真正 want/need 是显示带有工具提示的错误图像的部分。
编辑:
我正在使用 CommunityToolkit.MvvM。我的模型实现了 ObservableValidator,它实现了 INotifyDataErrorInfo。我模型中的属性使用 DataAnnotation 属性,例如 [Required]
和 [RegularExpression]
一个例子:
public class ServerModel : ObservableValidator
{
private string _iPAddress;
[Required]
[RegularExpression(@"^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$", ErrorMessage = "Not a valid IPv4 address.")]
public string IPAddress
{
get => _iPAddress;
set
{
SetProperty(ref _iPAddress, value);
ValidateProperty(value);
}
}
}
编辑 - 工作答案:
我最终从 ModernWpf 项目中复制了默认样式并删除了 primitives:ValidationHelper.IsTemplateValidationAdornerSite="True"
,以便我可以使用自己的验证模板。
试试这个绑定:
ToolTip="{Binding [0].ErrorContent}"
如果这不起作用,问题与 DefaultTextBoxStyle
.