如何实现绑定集合的绑定验证

时间:2012-02-09 07:54:34

标签: wpf validation data-binding collections

我是WPF的新手,并且在绑定集合的验证方面存在问题。

我有DataGrid,它被限制在一起组合在一起的多态对象的集合。

DataGrid有两列:

  • Lable oneTime限制为显示名称
  • TextBox TwoWay限制为TextBox LostFocus
  • 时的值

DataGrid的每一行都绑定到基类中的一个对象。每个派生类都有自己的验证方法,我试图根据派生类的实例为TextBox执行适当的验证方法。

我可以基于ExceptionValidationRule绑定验证,但性能不是很好,应用程序闪烁,因为它有很多例外。我也知道我可以这样做抛出TextBox LostFocus的事件并获取源对象,但是如果可能的话,我试图对有界对象使用WPF验证。

我尝试在基类中继承ValidationRule并传递它,但它是用函数的基类输入而不是从派生的有界项输入 我试图创建实现ValidationRule和DependencyObject的单独类,我试图将源对象传递给它,如下所述:http://dedjo.blogspot.com/2007/05/fully-binded-validation-by-using.html

但我仍然无法让它发挥作用。为简单起见,我创建了一个具有TestString属性的DependencyObject,并尝试将其绑定到Display Name(Label的有界路径)。但是从不调用TestString的集合。

我该怎么做?如何调用相应的验证方法?我可以以某种方式将有界对象传递给Valuator吗?

感谢您的帮助, 沙立

我使用的代码:

DependencyObject的实现类:

class ManifestPropertyDependency : DependencyObject
{

    private ManifestProperty _manifestPropertyInstance;
    public ManifestProperty ManifestPropertyInstance
    {
        get { return (ManifestProperty)GetValue(ManifestPropertyInstanceProp); }
        set
        {
            SetValue(ManifestPropertyInstanceProp, value);
        }
    }

    private string testString;
    public string TestString {
        get { return (string)GetValue(TestStringProp); }
        set { SetValue(TestStringProp, value); }
    }
    public ManifestPropertyDependency()
    {
        testString = "";
        _manifestPropertyInstance = new ManifestProperty();
    }
    public static readonly DependencyProperty ManifestPropertyInstanceProp =
       DependencyProperty.Register("ManifestPropertyInstance", typeof(ManifestProperty),
       typeof(ManifestPropertyDependency), new UIPropertyMetadata(new ManifestProperty()));

    public static readonly DependencyProperty TestStringProp =
       DependencyProperty.Register("TestString", typeof(string),
       typeof(ManifestPropertyDependency), new UIPropertyMetadata(""));
}

ValidationRule的实现类:

class ManifestPropertyValidator : ValidationRule
{
    private ManifestProperty _manifest;
    private ManifestPropertyDependency _manifestPropertyDependency;
    public string Stam { get { return _manifestPropertyDependency.TestString; } set { _manifestPropertyDependency.TestString = value; } }
    public ManifestPropertyDependency ManifestPropertyDependency
    {
        get { return _manifestPropertyDependency; }


        set
        {
            _manifestPropertyDependency = value;
            Stam = value.TestString;
            _manifest = value.ManifestPropertyInstance;
        }
    }


    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        try
        {
            string errorMessage = "";
            if (ManifestPropertyDependency.ManifestPropertyInstance.ValidateString((string)value, ref errorMessage))
            {
                return new ValidationResult(true, null);
            }
            return new ValidationResult(false, errorMessage);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, "Illegal characters or " + e.Message);
        }
    }
}

验证的Xaml:

<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}" 
                                 Style="{StaticResource textStyleTextBox}">
    <TextBox.Text>
        <Binding Path="Value" Mode="TwoWay"  
                 UpdateSourceTrigger="LostFocus">
            <Binding.ValidationRules>
                <Classes:ManifestPropertyValidator>
                    <Classes:ManifestPropertyValidator.ManifestPropertyDependency>
                        <Classes:ManifestPropertyDependency TestString="{Binding Path=DisplayName}"/>
                    </Classes:ManifestPropertyValidator.ManifestPropertyDependency>
                </Classes:ManifestPropertyValidator> 
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

1 个答案:

答案 0 :(得分:0)

老实说,我无法取消你的代码,但是看看你的要求,我发现这只是IDataErrorInfo接口的候选者。

为什么不使用它呢?

你还谈到了验证的缓慢性。你能详细说明吗?你的模板慢吗?你的验证逻辑是否缓慢?或者你认为验证通知本身很慢?