gpt4 book ai didi

c# - 在 WPF 的 UserControl 中显示控件的验证错误模板

转载 作者:太空狗 更新时间:2023-10-29 17:48:19 24 4
gpt4 key购买 nike

如何让 WPF 错误模板出现在 WPF 的 UserControl 中的控件上?

我有一个包含两个标签、两个文本框和一个复选框的用户控件。其中一个 TextBox 表示实体的名称,它绑定(bind)到 ViewModel 公开的 Model 属性的 Name 属性,它是我的 Window 的 DataContext。 Model 类实现 IDataErrorInfo 接口(interface),我已经通过单元测试确认,当 Name 为空时,通过属性索引器实现返回错误。我已经绑定(bind)到支持我的 UserControl 中的 Name TextBox 的依赖属性,当遇到验证错误时,WPF 错误模板会在整个 UserControl 周围放置一个红色边框,而不仅仅是 Name TextBox。

绑定(bind)到 UserControl 的名称字段如下。

<vc:MyUserControl ItemName="{Binding Model.Name, ValidatesOnDataErrors=True}" />

我的 UserControl 和支持 DependencyProperty 的简化版本如下。

<UserControl>
<Grid>
<TextBox Text="{Binding ItemName}" />
</Grid>
</UserControl>

public partial class MyUserControl: UserControl
{
public static readonly DependencyProperty ItemNameProperty =
DependencyProperty.Register(
"ItemName",
typeof(string),
typeof(MyUserControl),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);

public string ItemName
{
get { return (string)GetValue(ItemNameProperty); }
set { SetValue(ItemNameProperty, value); }
}
}

到目前为止,我发现的与此问题相关的信息都是关于 Silverlight 或使用转换器不显示红色边框(这对我来说没有意义)。这些信息都是在 stackoverflow 上找到的。

有没有人能够用 WPF 解决这个问题?我是否忽略了一些明显的东西?

最佳答案

如果绑定(bind)到您的 UserControl 使用 ValidatesOnDataErrors=True,则将使用 UserControlErrorTemplate .但是您可以使用 Validation.ErrorTemplate Attached Property 删除红色边框.

如果您通过实现 IDataErrorInfo 来验证它们的绑定(bind),您的 UserControl 中的所有控件将只显示红色边框。也用于支持 DependencyProperties。

public class MyUserControl : UserControl, IDataErrorInfo
{
public static readonly DependencyProperty ItemNameProperty =
DependencyProperty.Register(
"ItemName",
typeof(string),
typeof(MyUserControl),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);

public string ItemName
{
get { return (string)GetValue(ItemNameProperty); }
set { SetValue(ItemNameProperty, value); }
}

public string Error
{
get { throw new NotImplementedException(); }
}

public string this[string columnName]
{
get
{
// use a specific validation or ask for UserControl Validation Error
return Validation.GetHasError(this) ? "UserControl has Error" : null;
}
}
}

这里是简化的 XAML

<UserControl Validation.ErrorTemplate="{x:Null}">
<Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}">
<TextBox Text="{Binding ItemName, ValidatesOnDataErrors=True}" />
</Grid>
</UserControl>

添加

如果你想区分错误,你可以得到 BindingExpression为您的 DependencyProperty 检查 HasError Property .

BindingExpression be = BindingOperations.GetBindingExpression(this, ItemNameProperty);
return be != null && be.HasError ? "ItemName has Error" : null;

关于c# - 在 WPF 的 UserControl 中显示控件的验证错误模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com