WPF - 如何将基础控件的验证模板用于用户控件

wpf - how to use an underlying control's validation template for an user control

提问人:Marcel L 提问时间:3/8/2023 最后编辑:Marcel L 更新时间:3/9/2023 访问量:83

问:

我有一个由文本块和文本框组成的用户控件,如果我通过 INotifyDataErrorInfo 验证基础数据,整个控件将获得一个红色边框: 它的外观

我想使用文本框来显示我的用户控件数据中的错误,就好像我使用了文本框而不是我的控件一样。就我而言,我使用的是 wpf 材料设计,所以它看起来像这样

我的控件 xaml:

<UserControl  ....>
    <Grid Height="40" Width="380" Margin="0,1,0,1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="110"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding ElementName=LabelWithInputUC,Path=Label}" Grid.Column="0" Margin="0,4,0,0" VerticalAlignment="Bottom"/>

            <TextBox VerticalAlignment="Bottom"
                     Margin="10,0,30,0" Grid.Column="1"
                     x:Name="ContentTextBox"
                     MaxLength="{Binding ElementName=LabelWithInputUC,Path=MaxLength}"
                     IsReadOnly="{Binding ElementName=LabelWithInputUC,Path=IsReadOnly}"
                     Text="{Binding ElementName=LabelWithInputUC,Path=Text,UpdateSourceTrigger=PropertyChanged}"/>            

    </Grid>
</UserControl>

Label、MaxLength、IsReadOnly 和 Text 是我的用户控件中的依赖项属性。 使用我的控件的窗口将 text 属性绑定到视图模型中的属性,并在那里使用 INotifyDataErrorInfo 进行验证。

如果我尝试将文本框设置为控件 ValidationAdornerSite,我不会再看到任何验证错误。如何将内部文本框的错误模板用于用户控件?

更新

我创建了一个最小的示例来说明问题。

C# WPF 验证 MVVM

评论

0赞 mm8 3/8/2023
将模板附加属性设置为要使用的任何模板?Validation.Error{StaticResource MaterialDesignValidationErrorTemplate}
0赞 Marcel L 3/8/2023
文本框已具有正确的 ErrorTemplate。但是验证错误发生在父级(用户控件)绑定上,而不是文本框上。我可以以某种方式将文本框验证错误绑定到用户控件错误,以便文本框知道它吗?
0赞 mm8 3/8/2023
否,但您可以使用该方法将其标记为无效:stackoverflow.com/a/4287354/7252182Validation.MarkInvalid
0赞 Marcel L 3/8/2023
不太确定这对我有帮助。这只会让我将验证从漂亮的 INotifyDataErrorInfo mvvm 样式验证更改为代码隐藏中的验证。我仍然需要在我的视图模型中进行验证,因为我需要那里的验证结果。肯定必须有一种方法可以将此验证从一个绑定(用户控件文本绑定)冒泡到另一个绑定(内部文本框文本绑定)。我不能为此使用 ValidationAdornerSite 或 SiteFor?听起来这将是正确的方法。
0赞 mm8 3/8/2023
如果要使用 MVVM 处理此问题,则应对绑定到文本框的源属性执行验证,即控件应使示例中的属性无效。Text

答: 暂无答案