You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF项目中MaterialDesign与Xceed IntegerUpDown控件Tooltip错误提示问题

解决Xceed IntegerUpDown绑定错误信息Tooltip不显示的问题

我之前也碰到过类似的问题,Xceed的IntegerUpDown这类数值输入控件,内部视觉结构和原生TextBox/TextBlock不一样,所以你之前针对原生控件写的全局Tooltip样式没法直接作用到它身上。而且VS调试输出没提示绑定失败,大概率是因为绑定路径本身没错,但控件的Validation.Errors没有正确关联到Tooltip上。下面是几个可行的解决方案:

方案1:为IntegerUpDown编写全局样式

直接给IntegerUpDown单独写一个全局样式,把Tooltip绑定到它自身的Validation.Errors集合,再通过转换器把错误集合转成可读的字符串。

步骤1:创建错误信息转换器

先写一个转换器,把ValidationError集合转换成换行分隔的错误文本:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using System.Windows.Controls;

namespace YourProjectNamespace
{
    public class ValidationErrorsToStringConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values == null || values.Length == 0)
                return null;

            var errors = values[0] as ReadOnlyObservableCollection<ValidationError>;
            if (errors?.Count > 0)
                return string.Join(Environment.NewLine, errors.Select(e => e.ErrorContent.ToString()));

            return null;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException("逆向转换不需要实现");
        }
    }
}

步骤2:在资源中声明转换器

在你的App.xaml或者Window/UserControl的Resources里添加这个转换器:

<Window.Resources>
    <local:ValidationErrorsToStringConverter x:Key="ValidationErrorsToStringConverter"/>
    <!-- 其他资源 -->
</Window.Resources>

步骤3:编写IntegerUpDown的全局样式

同样在资源中添加针对IntegerUpDown的样式,继承它的默认样式并绑定Tooltip:

<Style TargetType="{x:Type xceed:IntegerUpDown}" 
       BasedOn="{StaticResource {x:Type xceed:IntegerUpDown}}">
    <Setter Property="ToolTip">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource ValidationErrorsToStringConverter}">
                <Binding Path="(Validation.Errors)" RelativeSource="{RelativeSource Self}"/>
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>

方案2:用附加属性实现通用的验证Tooltip(推荐)

如果你希望这个功能能复用在更多控件上,包括Xceed的其他输入控件,可以写一个附加属性,自动给控件绑定验证错误Tooltip:

步骤1:创建附加属性类

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace YourProjectNamespace
{
    public static class ValidationTooltipHelper
    {
        public static readonly DependencyProperty ShowValidationTooltipProperty =
            DependencyProperty.RegisterAttached(
                "ShowValidationTooltip", 
                typeof(bool), 
                typeof(ValidationTooltipHelper), 
                new PropertyMetadata(false, OnShowValidationTooltipChanged));

        public static bool GetShowValidationTooltip(DependencyObject obj)
        {
            return (bool)obj.GetValue(ShowValidationTooltipProperty);
        }

        public static void SetShowValidationTooltip(DependencyObject obj, bool value)
        {
            obj.SetValue(ShowValidationTooltipProperty, value);
        }

        private static void OnShowValidationTooltipChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is FrameworkElement element)
            {
                if ((bool)e.NewValue)
                {
                    element.Loaded += OnElementLoaded;
                }
                else
                {
                    element.Loaded -= OnElementLoaded;
                    element.ClearValue(FrameworkElement.ToolTipProperty);
                }
            }
        }

        private static void OnElementLoaded(object sender, RoutedEventArgs e)
        {
            if (sender is FrameworkElement element)
            {
                var errorsBinding = new Binding("(Validation.Errors)") 
                { 
                    RelativeSource = RelativeSource.Self 
                };
                var multiBinding = new MultiBinding 
                { 
                    Converter = new ValidationErrorsToStringConverter() 
                };
                multiBinding.Bindings.Add(errorsBinding);
                element.SetBinding(FrameworkElement.ToolTipProperty, multiBinding);
            }
        }
    }
}

步骤2:在IntegerUpDown上启用附加属性

在你的XAML中,给IntegerUpDown添加这个附加属性即可:

<xceed:IntegerUpDown 
    local:ValidationTooltipHelper.ShowValidationTooltip="True"
    Value="{Binding YourProperty, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>

关键注意事项

  1. 确认绑定配置正确:确保你的Value绑定设置了ValidatesOnDataErrors=True或者ValidatesOnNotifyDataErrors=True,否则ViewModel的验证错误不会传递到控件上。
  2. 检查验证逻辑:确认你的ViewModel确实抛出了验证错误(比如实现IDataErrorInfo或INotifyDataErrorInfo接口,并且返回了正确的错误信息)。
  3. 调试技巧:如果还是没生效,可以用Snoop工具查看IntegerUpDown的Validation.Errors集合是否有值,以及Tooltip的绑定状态,能快速定位问题。

内容的提问来源于stack exchange,提问作者user4266661

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:20:48