【发布时间】:2012-11-12 23:12:47
【问题描述】:
我有一个样式,我正在尝试将其应用于 DataGrid,但它只有在我给它一个键并明确表示要使用它时才有效。
<Application ...>
<Application.Resources>
<Style TargetType="{x:Type Control}" x:Key="ErrorStyle">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right"
Foreground="Orange"
FontSize="12pt">
!!!!
</TextBlock>
<Border BorderBrush="Green" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TextBox" BasedOn="{StaticResource ErrorStyle}" />
<Style TargetType="Label" BasedOn="{StaticResource ErrorStyle}" />
<Style TargetType="Button" BasedOn="{StaticResource ErrorStyle}" />
<Style TargetType="DataGrid" BasedOn="{StaticResource ErrorStyle}" />
</Application.Resources>
</Application>
以上适用于我的应用程序中的所有文本框、标签、按钮。但它不适用于 DataGrids。 然后我将 DataGrids 样式更改为:
<Style TargetType="DataGrid" BasedOn="{StaticResource ErrorStyle}" x:Key="DataGridErrorStyle" />
然后像这样明确地将其添加到我的 DataGrids 中
<DataGrid Name="myGrid" Style="{StaticResource ResourceKey=DataGridErrorStyle}" />
然后一切正常。
我只是想知道是否有人知道为什么 DataGrid 不会使用定义的隐式样式?为什么需要显式样式?
【问题讨论】:
-
我已经尝试过您的代码,它似乎在 DataGrid 上使用隐式样式运行良好。我不需要像您那样明确添加它。你确定它不工作?如果您仍然发现它不起作用,也许您可以准确地指出错误条件是如何在 DataGrid 上设置的,以便我可以更准确地重现它...
-
当我隐式调用数据网格时...它确实显示错误...但它只是一个红色边框(我相信可能是错误模板的默认值?).. 按钮/Lables/Textboxes 都正确地获得了控制模板中定义的绿色边框和文本块......我继续删除了显式调用,并从样式中删除了键......它又回到只显示一个红色边框对于数据网格......而所有其他人仍然得到绿色边框和文本块......这就是你得到的吗?
-
不,我恐怕会得到相同的效果,一个带有感叹号的绿色框,无论我为样式显式设置 x:Key 还是仅仅依赖它隐式出现。您的 DataGrid 是否有可能从代码中的其他位置继承了覆盖应用程序默认样式的样式?
-
哇...我的主窗口中有一个部分样式...并将其类型设置为 DataGrid...。拍脑袋将您写的内容发布为答案,我将其标记为解决方案。
-
好的,已发布。很高兴你能把它整理好。