gpt4 book ai didi

wpf - 您可以在 xaml 的 1 行中使用 Binding ValidationRule 吗?

转载 作者:行者123 更新时间:2023-12-04 03:12:08 29 4
gpt4 key购买 nike

我不知道正确的措辞来描述我在这里尝试做的事情......所以我将展示它。

我知道这个 xaml 有效:

<TextBox>
<TextBox.Text>
<Binding Path="Location" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<domain:NotEmptyValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

但这很冗长。我想以类似的方式做到这一点......
<TextBox Text={Binding Path=Location, UpdateSourceTrigger=PropertyChanged,
ValidationRules={domain:NotEmptyValidationRuleMarkup ValidateOnTargetUpdated=True}}"/>

我创建了一个名为 NotEmptyValidationRuleMarkup 的类返回 NotEmptyValidationRule 的实例,它有点工作。项目构建得很好,运行得很好,一切都按照我的预期工作。但是,我无法再在设计器中查看我的窗口。它给了我一个无效标记错误,因为 The property "ValidationRules" does not have an accessible setter. .的确,ValidationRules 没有 setter 。如果我尝试通过 C# 中的代码设置 ValidationRules,则会出现编译错误。但是由于某种原因,当我在 XAML 中分配它时,它实际上确实构建和运行得很好。我很困惑。有没有一种方法可以在不提升窗口设计 View 的情况下完成这项工作?

最佳答案

即使 xaml 解释器碰巧将标记扩展转换为可以工作的东西,但这并不是真正支持的。
MSDN - Binding Markup Extension

The following are properties of Binding that cannot be set using the Binding markup extension/{Binding} expression form.

  • ...

  • ValidationRules: the property takes a generic collection of ValidationRule objects. This could be expressed as a property element in a Binding object element, but has no readily available attribute-parsing technique for usage in a Binding expression. See reference topic for ValidationRules.


但是,让我建议一种不同的方法:不是将自定义标记扩展嵌套在绑定(bind)中,而是将绑定(bind)嵌套在自定义标记扩展中:
[ContentProperty("Binding")]
[MarkupExtensionReturnType(typeof(object))]
public class BindingEnhancementMarkup : MarkupExtension
{
public BindingEnhancementMarkup()
{

}
public BindingEnhancementMarkup(Binding binding)
{
Binding = binding;
}

[ConstructorArgument("binding")]
public Binding Binding { get; set; }

public override object ProvideValue(IServiceProvider serviceProvider)
{
Binding.ValidationRules.Add(new NotEmptyValidationRule());
return Binding.ProvideValue(serviceProvider);
}
}
并使用如下:
<TextBox Text="{local:BindingEnhancementMarkup {Binding Path=Location, UpdateSourceTrigger=PropertyChanged}}"/>
当然,对于生产,您可能希望在标记扩展中添加更多检查,而不是仅仅假设一切就绪。

关于wpf - 您可以在 xaml 的 1 行中使用 Binding ValidationRule 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44296652/

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