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}"/>
关键注意事项
- 确认绑定配置正确:确保你的
Value绑定设置了ValidatesOnDataErrors=True或者ValidatesOnNotifyDataErrors=True,否则ViewModel的验证错误不会传递到控件上。 - 检查验证逻辑:确认你的ViewModel确实抛出了验证错误(比如实现
IDataErrorInfo或INotifyDataErrorInfo接口,并且返回了正确的错误信息)。 - 调试技巧:如果还是没生效,可以用Snoop工具查看
IntegerUpDown的Validation.Errors集合是否有值,以及Tooltip的绑定状态,能快速定位问题。
内容的提问来源于stack exchange,提问作者user4266661
相关产品推荐
相关产品推荐

