Как реализовать проверку привязки для сбора привязки - PullRequest
0 голосов
/ 09 февраля 2012

Я новичок в 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

Но я все еще не могу заставить его работать.Для простоты я создал объект DependencyObject со свойством TestString и попытался привязать его к отображаемому имени (ограниченный путь метки).Но набор TestString никогда не вызывается.

Как я могу это сделать?Как я могу вызвать соответствующий метод проверки?Могу ли я каким-то образом передать ограниченный объект в Оценщик?

Спасибо за вашу помощь, Сарит

Используемый код:

Класс реализации 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 голосов
/ 09 февраля 2012

Честно говоря, я не смог понять ваш код, но, глядя на ваши требования, я обнаружил, что это просто кандидат на IDataErrorInfo интерфейс.

Почему вы не используете это вместо этого?

Также вы говорили о медлительности в валидации. Можете ли вы уточнить это? Ваш шаблон медленный? Ваша логика проверки медленная? Или вы думаете, что сами уведомления валидации медленные?

...