【问题标题】:Does System.Windows.Controls.ValidationRule only support Value Types for propertiesSystem.Windows.Controls.ValidationRule 是否仅支持属性的值类型
【发布时间】:2015-05-13 10:20:54
【问题描述】:

我正在使用以下 System.Windows.ValidationRule。

public class XXXValidationRule : ValidationRule
{
    public object FooObject { get; set;}
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        Bar barObject = this.FooObject.BarObject;
    }
}

我的 XAML 显示如下。

<ui:Windows.Resources>
    <ResourceDictionary>
       <viewModel:XXXValidationRule x:key="xxxValidationRule"/>
    </ResourceDictionary>
</ui:Windows.Resources>
...
<TextBox.Text>
    <Binding Path="..." UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>                   
            <viewModel:XXXValidationRule/>
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

到目前为止一切顺利。现在在我的 XAML 对话框的代码后面,我按如下方式初始化 ValidationRule。

public partial class XamlDialog : System.Windows.Window
{
    private System.Windows.Controls.ValidationRule xxxValidationRule;

    public XamlDialog()
    {
        InitializeComponent();
        InitializeResources();
    }

    public void InitializeResources()
    {
       this.xxxValidationRule = (ValidationRule)this.Resources["xxxValidationRule"];
       this.xxxValidationRule.FooObject= new FooObject();
    }
    ...
 }

关键是,当触发 XXXValidationRule.Validate 时,FooObject 属性始终为空。

如果我使用属性 FooObject 的值类型 int,效果相同。

如果我仍然使用值类型 int 并在 XAML 中明确设置属性,如下所示,我会在验证规则中收到正确的值 (99)。

<Binding.ValidationRules>
    <viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...

首先,ValidationRule 是否仅支持值类型,或者是否有办法使用上述引用类型?其次,我们是否必须在 XAML 中显式设置此类属性,或者有没有办法在代码隐藏中设置它?

感谢您的帮助:-)

【问题讨论】:

  • 您的绑定Binding.ValidationRules 将创建XXXValidationRule 的新实例,而不使用您设置FooObject 的资源实例

标签: c# .net wpf validationrules validationrule


【解决方案1】:

刚刚找到解决方案。感谢 dkozl 的评论和这个 stackoverflow 的回答 https://stackoverflow.com/a/3173461/3835909

如果我们定义验证规则如

<Binding.ValidationRules>
    <viewModel:XXXValidationRule FooObject="99"/>
</Binding.ValidationRules>
...

表示绑定Binding.ValidationRules 将始终创建XXXValidationRule 的新实例。要解决该问题,请按以下方式使用 StaticResource

<Binding.ValidationRules>
    <StaticResource ResourceKey="xxxValidationRule"/>
</Binding.ValidationRules>
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多