Применить правило проверки к свойству ItemsSource ListView - PullRequest
4 голосов
/ 18 января 2011

Я хотел бы проверить ListView, проверив, содержит ли ItemsSource пустую коллекцию.Вот XAML.

<ListView x:Name="lstvItemsInGroup" 
            <ListView.ItemsSource>
                <Binding Path="ItemsInGroup" Mode="OneWay" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <local:CollectionNotEmptyValidationRule ErrorMessage="You must select at least one item" />
                    </Binding.ValidationRules>
                </Binding> 
            </ListView.ItemsSource>

        </ListView>

Вот ValidationRule.

public class CollectionNotEmptyValidationRule : ValidationRule
    {
        public string ErrorMessage
        { get; set; }



    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        ValidationResult lResult = null;

        IEnumerable<object> lCollection = (IEnumerable<object>)value;
        if (lCollection == null || lCollection.Count() == 0)
        {
            lResult = new ValidationResult(false, ErrorMessage);
        }
        else
        {
            lResult = new ValidationResult(true, null);
        }

        return lResult;
    }

Я принудительно проверяю при загрузке usercontrol с

lstvItemsInGroup.GetBindingExpression(ListView.ItemsSourceProperty).UpdateSource();

Но ValidationRule isn 'Я даже не звонил, у меня точка останова в первой строке и ничего.

Есть какие-нибудь подсказки?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 18 января 2011

Здесь http://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpression.updatesource.aspx сказано, что метод UpdateSource обновляет источник, только если привязка находится в режимах TwoWay или OneWayToSource.Итак, попробуйте установить Mode=TwoWay для вашей привязки.

3 голосов
/ 08 января 2016

Это работает:

public class CollectionNotEmptyValidationRule : ValidationRule
{
    public CollectionNotEmptyValidationRule()
        : base(ValidationStep.RawProposedValue, true)
    {
    }

    public string ErrorMessage { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        return (value as IEnumerable<object>)?.Any() == true
            ? ValidationResult.ValidResult
            : new ValidationResult(false, ErrorMessage);
    }
}

<ListView>
    <ListView.ItemsSource>
        <Binding Mode="OneWay"
                    Path="Empty"
                    UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:CollectionNotEmptyValidationRule ErrorMessage="Collection cannot be empty" />
            </Binding.ValidationRules>
        </Binding>
    </ListView.ItemsSource>
</ListView>

Делая так, вы не отслеживаете изменения коллекции.

Если вы хотите, вы можете использовать:

public class MinValidationRule : ValidationRule
{
    public static readonly DependencyProperty AssertMinProperty = DependencyProperty.RegisterAttached(
        "AssertMin",
        typeof(int),
        typeof(MinValidationRule),
        new PropertyMetadata(default(int)));

    public MinValidationRule()
        : base(ValidationStep.ConvertedProposedValue, true)
    {
    }

    public string ErrorMessage { get; set; }

    public int Min { get; set; }

    public static void SetAssertMin(DependencyObject element, int value)
    {
        element.SetValue(AssertMinProperty, value);
    }

    public static int GetAssertMin(DependencyObject element)
    {
        return (int)element.GetValue(AssertMinProperty);
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        return ((int)value) >= Min
            ? ValidationResult.ValidResult
            : new ValidationResult(false, ErrorMessage);
    }
}

<ListView MinHeight="20" ItemsSource="{Binding VmItems}">
    <local:MinValidationRule.AssertMin>
        <Binding Path="Items.Count" RelativeSource="{RelativeSource Self}">
            <Binding.ValidationRules>
                <local:MinValidationRule ErrorMessage="Collection must have at least one item" Min="1" />
            </Binding.ValidationRules>
        </Binding>
    </local:MinValidationRule.AssertMin>
</ListView>
0 голосов
/ 18 января 2011

Если вы хотите проверить, вы должны использовать соответствующий метод вместо попытки обновления источника:

BindingExpression.ValidateWithoutUpdate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...