如何根据xaml中的ErrorContent动态更改Validation.ErrorTemplate

时间:2011-07-09 02:34:58

标签: wpf

我正在尝试实现此answer中描述的内容。我想有一个用于验证警告的模板和一个用于错误的模板。我以为我通过在这样的样式触发器中绑定到Validation.ErrorTemplate来弄明白:

<Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="Validation.ErrorTemplate" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource ValidationTemplateConverter}, Path=(Validation.Errors)[0].ErrorContent}" ></Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

转换器只需从ErrorContent中获取一个键,然后在ResourceDictionary中查找正确的模板。不幸的是,这不起作用,因为不允许绑定到Validation.ErrorTemplate - ArgumentException

'ErrorTemplate' property cannot be data-bound.
Parameter name: dp

还有其他人试图实现这样的东西吗?

1 个答案:

答案 0 :(得分:1)

你不能把这个逻辑移到DataTemplateSelector吗?我假设您将Validation.Errors绑定到某种ItemsControl - ItemsControl可以DataTemplateSelector显示错误内容,具体取决于它是否为警告或错误。

如果您只是显示第一个错误,那么您可以随时将模板包含ContentControl,数据绑定ContentValidation.Errors[0]并应用ContentTemplateSelector

<Style TargetType="TextBox">
      <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <DockPanel>
                        <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent},  Path=(Validation.Errors)"
                                 ItemTemplateSelector="{StaticResource ErrorTemplateSelector}" />
                        <AdornedElementPlaceholder/>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
      </Setter>
</Style>