我对WPF很陌生,但我在过去的几天里已经阅读了很多内容以及MVVM。 我的WPF显示带有自定义列模板的DataGrid(使用Xceed WPF Toolkit中的NumericUpDown控件)。其中三列包含3D矢量的小数点坐标。我使用IDataErrorInfo来确保向量的长度永远不为0(所有三列不能同时为0)。到目前为止,此工作正常,当验证失败时,单元格标记为红色,但我还想在工具提示或类似工具中显示错误消息。
<DataGrid [...]>
<DataGrid.Columns>
[...]
<DataGridTemplateColumn Header="X" [...]>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<xctk:DecimalUpDown Value="{Binding PositionX, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}">
</xctk:DecimalUpDown>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
[... and same thing for Y and Z]
</DataGrid.Columns>
</DataGrid>
这是我现在停留几个小时的地方,所以我希望你能在这里帮助我:
如何在自定义模板列上显示错误工具提示?
我已经阅读了很多关于错误工具提示的文章和主题,但是大多数都是在普通的TextBox或DataGridTextColumns上进行了大量尝试,但是到目前为止还没有让它工作。
他们中的大多数看起来像这样:
<Style x:Key="errorStyle" TargetType="{x:Type TextBox}">
<Setter Property="Padding" Value="-2"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
从这里: https://msdn.microsoft.com/library/ee622975%28v=vs.100%29.aspx
或更多示例:
这一切都没有向我展示任何工具提示。
你能给我一个提示,
谢谢!
答案 0 :(得分:2)
如果附加的Validation.HasError属性返回true,则将控件的Style属性设置为带触发器的Style,该触发器设置CellTemplate中控件的Tooltip属性:
<DataGridTemplateColumn Header="X">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<xctk:DecimalUpDown Value="{Binding PositionX, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}">
<xctk:DecimalUpDown.Style>
<Style TargetType="xctk:DecimalUpDown">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource Self}}" />
</Trigger>
</Style.Triggers>
</Style>
</xctk:DecimalUpDown.Style>
</xctk:DecimalUpDown>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>