我想按预期使用工具提示。但是当发生错误时,我想更改它们以显示错误消息,然后,当错误修复时,将它们更改回来。
所以我创建了一个附加属性来保存工具提示。我将工具提示分配给附加属性,然后使用样式将其复制到工具提示属性。如果出现错误,样式会将工具提示设置为错误消息。
因此,在工具提示中设置错误消息的触发器是:
<Trigger Property="Validation.HasError"
Value="true">
<Setter Property="BorderBrush"
Value="{DynamicResource controls-errorBorderBrush}" />
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
这似乎相当容易(并且有效)
修复错误后,我将其重新设置(这不起作用):
<Trigger Property="Validation.HasError"
Value="false">
<Setter Property="ToolTip"
Value="{Binding Path=(wpfMisc:myCtrl.tooltipValue)}" />
</Trigger>
在 xaml 文件中,我有:
<TextBox Text="this is a textbox with a myMisc based tooltip"
Name="txtTooltip2"
wpfMisc:myCtrl.tooltipValue="Tooltip Test tooltip" />
所以当然,问题很可能出在我的附加属性中,因为信息似乎没有正确保存。这是该代码:
public static string GettooltipValue(DependencyObject obj)
{
string value = obj.GetValue(tooltipValueProperty).ToString() ;
value = value.trimNull() ; // extension method to insure at least an empty string
return value ;
}
public static void SettooltipValue(DependencyObject obj, string value)
{
obj.SetValue(tooltipValueProperty, value.trimNull() );
}
public static readonly DependencyProperty tooltipValueProperty =
DependencyProperty.RegisterAttached("tooltipValue",
typeof(string),
typeof(myCtrl),
new UIPropertyMetadata(string.Empty));
所以我的猜测是我需要在 UIPropertyMetaData 中使用不同的东西,但不确定我会使用什么。还是我的整个方法都是错误的?
我想为所有数据字段提供特定于数据的工具提示。
我确实通过在错误期间将工具提示移动到标签属性来实现这一点,但我不想让它以这种方式工作,因为我知道当其他一些代码想要在某些特殊情况下使用标签时我最终会遇到问题方法。
另外,我知道有些代码很冗长 - 只是调试的副作用......
myCtrl 中的另一个依赖属性工作得很好,所以我知道 xmlns 等引用是正确的。
在进一步研究中,我在输出窗口中发现以下内容:System.Windows.Data 错误:17:无法从“”(类型“layoutSettingsViewModel”)获取“工具提示值”值(类型“字符串”)。绑定表达式:路径=(0);DataItem='layoutSettingsViewModel' (HashCode=46457861); 目标元素是'TextBox'(名称='');目标属性是“工具提示”(类型“对象”) InvalidCastException:“System.InvalidCastException:无法将类型“client.Models.layoutSettings.layoutSettingsViewModel”的对象转换为类型“System.Windows.DependencyObject”。
layoutSettingsViewModel 是 xaml 视图。所以我认为视图本身以某种方式获得了价值而不是控件......虽然不确定 - 我猜你们中的一个人确切地知道它意味着什么以及为什么......我讨厌试图加快速度新语言...
无论如何,感谢任何帮助和/或建议。