WPF, свойство в ValidationRule никогда не устанавливается - PullRequest
0 голосов
/ 26 августа 2010

Я пытаюсь привязать свойство в моем DataContext к свойству в ValidationRule:

public class ReleaseValidationRule : ValidationRule
{
    // I want to bind a value from my DataContext to this property:
    public CheckboxViewModels ValidReleases { get; set; }
    ...
}

Основываясь на этой теме , я создал класс CheckboxViewModels просто для того, чтобы действовать как обертка для List<CheckboxViewModel>, чтобы список мог быть DependencyProperty, чтобы я мог связываться с ним. Однако в моем методе Validate в моем ValidationRule список ValidReleases всегда пуст. Вот мой XAML:

<TextBox>
    <TextBox.Text>
        <Binding Path="Release" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:ReleaseValidationRule>
                    <local:ReleaseValidationRule.ValidReleases>
                        <local:CheckboxViewModels List="{Binding Path=Releases,
                            Converter={StaticResource debugConverter}}"/>
                    </local:ReleaseValidationRule.ValidReleases>
                </local:ReleaseValidationRule>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Я знаю, что свойство Releases (то, что я связываю со свойством List CheckboxViewModels) имеет содержимое, потому что у меня есть TreeView чуть выше TextBox, который показывает содержимое Releases , Конвертер, который у меня есть на привязке CheckboxViewModels.List, ничего не делает, это просто место, где я могу установить точку останова. Самое смешное, что точка останова конвертера никогда не будет достигнута. Как будто вся строка <local:CheckboxViewModels List="{Binding Path=Releases, Converter={StaticResource debugConverter}}"/> никогда не выполняется, поэтому свойство ValidReleases в моем ValidationRule никогда не устанавливается. Что происходит?

Редактировать: вот как выглядит CheckboxViewModels:

public class CheckboxViewModels : DependencyObject, IList<CheckboxViewModel>,
    IEnumerable<CheckboxViewModel>
{
    ...members necessary to implement IList, IEnumerable...

    public static readonly DependencyProperty ListProperty =
        DependencyProperty.Register(
            "List",
            typeof(List<CheckboxViewModel>),
            typeof(CheckboxViewModels),
            new PropertyMetadata(new List<CheckboxViewModel>())
        );

    public List<CheckboxViewModel> List
    {
        get { return (List<CheckboxViewModel>)GetValue(ListProperty); }
        set { SetValue(ListProperty, value); }
    }
}

Ответы [ 3 ]

0 голосов
/ 26 августа 2010

Хорошо, теперь я просто чувствую себя глупо. У меня был конструктор в CheckboxViewModels, который устанавливал List = new List<CheckboxViewModel>(). Я думаю, что это что-то сбрасывает? Я удалил этот конструктор, и начальное значение List устанавливается только в методе Register для DependencyProperty: new PropertyMetadata(new List<CheckboxViewModel>()). ValidReleases теперь заполняется, как и ожидалось, следующим XAML:

<TextBox>
    <TextBox.Text>
        <Binding Path="Release" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:ReleaseValidationRule ValidatesOnTargetUpdated="True">
                    <local:ReleaseValidationRule.ValidReleases>
                        <local:CheckboxViewModels
                            List="{Binding Path=Releases, Mode=OneWay}"/>
                    </local:ReleaseValidationRule.ValidReleases>
                </local:ReleaseValidationRule>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Редактировать: не так уж глупо: отсутствие конструктора в CheckboxViewModels привело к двум свойствам зависимости типа CheckboxViewModels, использующим один и тот же список, поэтому у меня были выпуски и другие данные в обоих Releases имущество и другое имущество. Добавление конструктора обратно к CheckboxViewModels приводит к тому, что у ValidReleases больше не будет элементов. Я думаю, что я должен связывать что-то неправильно.

0 голосов
/ 31 августа 2010

Я перестал использовать правила проверки и вместо этого следовал этому руководству по реализации IDataErrorInfo. Это был мой экземпляр класса, полностью инициализированный к тому времени, когда я вхожу в this[string], чтобы выяснить сообщение об ошибке. Данные, которые я пытался передать, были просто данными из другого свойства того же экземпляра. То есть я хотел проверить Property1, используя некоторые данные из Property2. С IDataErrorInfo, когда я проверяю Property1 и собираю сообщение об ошибке, если необходимо, у меня есть доступ к Property2 по желанию, без необходимости что-либо передавать.

0 голосов
/ 26 августа 2010

Пахнет как отсутствующее свойство Изменено уведомление где-то. Трудно понять, из чего состоит CheckboxModels, но если бы это был ObservableCollection, вы бы изменили свойство без дополнительной работы. Имеет ли это смысл?

НТН,
Berryl

...