التحقق من الصحة. لا يتم تشغيل haserror مرة أخرى إذا حدث خطأ جديد بينما صحيح بالفعل

StackOverflow https://stackoverflow.com/questions/4606509

سؤال

يمكنني استخدام MVVM وكائني ينفذ idataerrorinfo. عندما يتم تعيين خاصية ، أقوم بتشغيل طرق التحقق المخصصة وإذا تم تمرير التحقق من الصحة ، فأنا أعيد string.empty ، والذي يحدد التحقق من الصحة. haserror إلى false. إذا فشل التحقق من الصحة ، يتم ضبط التحقق من الصحة. لدي نمط أستخدمه لـ "عناصر التحكم المطلوبة" (عناصر التحكم التي ستؤدي التحقق من الصحة) وتعيين تلميح الأدوات لعنصر التحكم في أي خطأ مثل هذا:

<Style x:Key="RequiredControl" TargetType="{x:Type Control}" >
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding (Validation.Errors), Converter={StaticResource ErrorConverter}, RelativeSource={x:Static RelativeSource.Self}}"/>
        </Trigger>
    </Style.Triggers>
</Style>

و ErrorConverter:

public class ZynErrorContentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var errors = value as ReadOnlyObservableCollection<ValidationError>;
        if (errors == null) return "";

        return errors.Count > 0 ? errors[0].ErrorContent : "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

المشكلة هي: يقوم المستخدم بإدخال شيء غير صالح ... والتحقق من الصحة. تم تعيين haserror على صحيح. يتم تحديثات تلميح الأدوات كما من المفترض. إذا حاول المستخدم تصحيح الخطأ ، ولكنه يدخل قيمة تسبب نوعًا مختلفًا من الإبطال ، فيجب أن تعرض تلميح الأدوات سلسلة الأخطاء الجديدة ، ولكن هذا لا يحدث. يظهر الخطأ نفس الخطأ من الخطأ الأول. أعلم لماذا يحدث هذا (على ما أظن) ... لأن الزناد لا يتم تشغيله لأن التحقق من الصحة. لا يتغير Haserror أبدًا من True -> false -> True.

هل لدى أي شخص أي خبرة في هذا أو بعض النصائح حول كيفية فرض الزناد؟

هل كانت مفيدة؟

المحلول

يبدو أن هذا هو الجواب: idataerrorinfo مع رسائل خطأ متعددة لخاصية

في الأساس ، يمكنك ربط العنصر الحالي واستخدام ContentPresenter لعرض الخطأ. لقد عملت في الكود الخاص بي.

نصائح أخرى

أعتقد أنني اكتشفت هذا. الجاني هو استخدام المحول. كنت أعاني من نفس القضية وكانت مقتطف رمز المشكلة:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
                        Path=(Validation.Errors), 
                        Converter={StaticResource validationErrorsToStringConverter }}"/>

أقوم بتغيير المقتطف إلى:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
        Path=(Validation.Errors)[0].ErrorContent}"/>

وتم حل القضية.

الخلاصة - لا تستخدم محول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top