验证.有错误工具提示内容

本文关键字:工具提示 有错误 验证 | 更新日期: 2023-09-27 18:30:49

我正在尝试创建自定义验证规则机制。我想在Validation.HasError为真时切换工具提示样式和内容。为此,我正在使用这个:

<Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip">
            <Setter.Value>
                <ToolTip
                    ToolTip="{Binding  Path=(Validation.Errors)[0].ErrorContent}"
                    Tag="{Binding  Path=(Validation.Errors)[0].ErrorContent, Converter={StaticResource TooltipJoin}}"
                    Style="{StaticResource WarningTooltip}"/>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>

警告工具提示模板为:

<Border BorderThickness="1"
    BorderBrush="{DynamicResource FeedackBrush}"
    Background="{DynamicResource Color}"
    MinWidth="42" CornerRadius="2"
    Padding="5,3,5,3">
    <!--Holds the image and text for the tooltip-->
    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <ContentPresenter
          Grid.Column="0"
          Content="{DynamicResource WarningIcon}"
          Width="32"
          Height="32"/>
        <!--Display the text-->
        <TextBox Background="Transparent"
             BorderThickness="0"
             VerticalAlignment="Center"
             Grid.Column="1"
             Foreground="{DynamicResource ForgroundColor}"
             Text="{TemplateBinding Content}"
             TextAlignment="Center"
             BorderBrush="Transparent"/>
    </Grid>
</Border>

验证方法:

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
  {
     try
     {
        if (value != null)
        {
           var index = (int)value;
           if (index == 2 || index == 5)
           {
              return new ValidationResult(true, null);
           }
        }
     }
     catch (Exception e)
     {
        return new ValidationResult(false, e.Message);
     }
     return new ValidationResult(false, "Please select corect item");
  }

在 xaml 中:

<ComboBox Name="MyCombo"
            Grid.Row="0" 
            Grid.Column="0" 
            BorderThickness="5"
            ItemsSource="{Binding MyItemsCollection,UpdateSourceTrigger=PropertyChanged}"
            Height="30" 
           Margin="50,178,50,42">
        <ComboBox.SelectedIndex>
            <Binding Path="Index" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules >
                    <c:ComboBoxRule ItemIdex="2" ValidatesOnTargetUpdated="True" />
                </Binding.ValidationRules>
            </Binding>
        </ComboBox.SelectedIndex>
</ComboBox>

我可以在常规样式和警告工具提示样式之间切换样式,但内容为空。对内容问题有什么建议吗?

验证.有错误工具提示内容

我相信

这是你的问题。ToolTip应该设置Content,而不是它的ToolTip。此外,您还需要使用 BindingMode of Self 指定一些RelativeSource来定位样式化元素,而不是使用隐式 DataContext(来自您的视图模型):

<Setter.Value>
      <ToolTip
           Content="{Binding Path=(Validation.Errors)[0].ErrorContent,
                             RelativeSource={RelativeSource Self}}"
           Tag="{Binding Path=(Validation.Errors)[0].ErrorContent, 
                 Converter={StaticResource TooltipJoin},
                 RelativeSource={RelativeSource Self}}"
           Style="{StaticResource WarningTooltip}"/>
</Setter.Value>

以某种方式找到解决方法:我把它放在触发器中

 <Trigger Property="Validation.HasError" Value="true">
             <Setter Property="ToolTip">
                    <Setter.Value>
                        <ToolTip  Style="{StaticResource WarningTooltip}"/>
                    </Setter.Value>
             </Setter>
                <Setter Property="Tag" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent, Converter={StaticResource TooltipJoin}}"/>
            </Trigger>

对于文本框内容,我使用了这样的东西:

Content="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Control}, AncestorLevel=2}}"