سؤال

أحاول كتابة قاعدة التحقق من صحة WPF المخصصة لفرض أن خاصية معينة فريدة في سياق مجموعة معينة.على سبيل المثال:أقوم بتحرير مجموعة من الكائنات المخصصة المرتبطة بـ ListView وأحتاج إلى التأكد من أن خاصية الاسم لكل كائن في المجموعة فريدة من نوعها.لا أحد يعرف كيفية القيام بذلك؟

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

المحلول

أولاً، سأقوم بإنشاء فئة DependencyObject بسيطة للاحتفاظ بمجموعتك:

class YourCollectionType : DependencyObject {

    [PROPERTY DEPENDENCY OF ObservableCollection<YourType> NAMED: BoundList]

}

بعد ذلك، في الفئة المشتقة من ValidationRule، قم بإنشاء خاصية:

YourCollectionType ListToCheck { get; set; }

ثم، في XAML، قم بما يلي:

<Binding.ValidationRules>
    <YourValidationRule>
       <YourValidationRule.ListToCheck>     
          <YourCollectionType BoundList="{Binding Path=TheCollectionYouWantToCheck}" />
       </YourValidationRule.ListToCheck>
    </YourValidationRule>
</Binding.ValidationRules>

بعد ذلك، أثناء التحقق من الصحة، انظر إلى مجموعة خاصية BoundList الخاصة بـ ListToCheck لمعرفة العنصر الذي تقوم بالتحقق من صحته مقابله.إذا كان موجودًا هناك، فمن الواضح أنه سيُرجع نتيجة تحقق خاطئة.إذا لم يكن كذلك، يعود صحيحا.

نصائح أخرى

سأقوم فقط بإنشاء كائن تبعية مخصص إذا كانت هناك خصائص أخرى أرغب في ربطها بالقاعدة.نظرًا لأن كل ما نفعله في هذه الحالة هو إرفاق مجموعة واحدة من القيم للتحقق منها، فقد قمت بإعداد ملفي <UniqueValueValidationRule.OtherValues> الملكية أ <CollectionContainer>.

ومن هناك، لتجاوز مشكلة DataContext لا يتم توريثها، <TextBox.Resources> اللازمة للحصول على <CollectionViewSource> للاحتفاظ بالربط الفعلي وإعطائه أ {StaticResource} المفتاح الذي OtherValues يمكن بعد ذلك استخدامه كمصدر ربط.

تحتاج قاعدة التحقق نفسها بعد ذلك إلى التكرار فقط OtherValues.Collection وإجراء فحوصات المساواة.

يراقب:

    <TextBox>
        <TextBox.Resources>
            <CollectionViewSource x:Key="otherNames" Source="{Binding OtherNames}"/>
        </TextBox.Resources>
        <TextBox.Text>
            <Binding Path="Name">
                <Binding.ValidationRules>
                    <t:UniqueValueValidationRule>
                        <t:UniqueValueValidationRule.OtherValues>
                            <CollectionContainer Collection="{Binding Source={StaticResource otherNames}}"/>
                        </t:UniqueValueValidationRule.OtherValues>
                    </t:UniqueValueValidationRule>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top