سؤال

هذا واحد معقد إلى حد ما ، وآمل أن أتمكن من توضيح ذلك بما يكفي لشخص ما لمساعدتي. لديّ كائن يتيح له تسميته مديرًا ، ويحتوي المدير على مجموعة من الأشخاص يديرهم ، ويقوم جميع الأشخاص بتطبيق Iperson ، لكن أنواع مختلفة من الأشخاص لديهم خصائص مختلفة. أريد أن أعرض هذا المدير في شجرة ، وتحت عقدة المدير ، أريد أن أعرض جميع المشاريع التي يديرها والتي يمكن تحديدها من الأشخاص الذين يديرهم.

وبالتالي فإن الخطة هي استخدام محول لتحويل شخص ما إلى قائمة بالمشاريع. ها هو xaml:

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}">
   <TextBlock Text="{Binding Path=Name}"/>
    <HierarchicalDataTemplate.ItemTemplate>
        <DataTemplate>
                    <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate.ItemsSource>
        <Binding Path="People">
            <Binding.Converter>
                <configUtil:ProjectListConverter/>
            </Binding.Converter>
        </Binding>
    </HierarchicalDataTemplate.ItemsSource>
</HierarchicalDataTemplate>

ينفذ فئة شخصي inotifyPropertyChanged ، والقائمة التي تحمل الأشخاص تنفذ inotifyCollectionChanged. يعمل هذا الرمز بشكل رائع عندما أقوم بتعيين TreeView electsource ، ويتم عرض المديرين مع قائمة مشاريعهم.

ومع ذلك ، عندما أضيف شخصًا جديدًا إلى قائمة الأشخاص ، لم يتم تحديث TreeView. عندما أقوم بالتصحيح ، أستطيع أن أرى أن CollectionChanged يتم إطلاق النار مع الإجراء إضافة والعنصر المضافة. كما أن حدث CollectionChanged ليس فارغًا ، لذا أعرف أن واجهة المستخدم يشاهده. لكن المحول لا ينفذ عند إضافة العنصر.

فيما يلي طريقة إضافة القائمة التي تحمل كائنات Iperson:

public void Add(T item)
{
    list.Add(item);
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}

هل أنا بطريقة ما كسر البيانات؟

ما الأشياء الأخرى التي يمكنني التحقق منها؟

ينظر المحول فقط إلى كل عنصر في قائمة الأشخاص ويكتشف المشاريع التي يعملون عليها ويضيف اسم المشروع إلى قائمة الإخراج.

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

المحلول

يتم تطبيق المحول على الخاصية التي تخزن المجموعة. لذلك ، سيتم استدعاؤه فقط إذا تغير مثيل المجموعة نفسه (ليس إذا تم تغيير العناصر الموجودة في المجموعة). تتمثل إحدى الطرق في هذا إلى إبطال المجموعة عندما تريد تحديثها.

إن أبسط طريقة لإبطال خاصية المجموعة والتسبب في تشغيل رمز المحول مرة أخرى null خارج المجموعة وإعادة تعيينها. طريقة أخرى هي الحصول على BindingExpression (عبر BindingOperations) و اتصل UpdateTarget. أخيرًا ، يمكنك بدلاً من ذلك ربط ملف CollectionView (أو فئة فرعية منها) والاتصال Refresh عليه.

وإذا كنت حقًا تريد إصلاح المشكلة بشكل نظيف ، يمكنك ربط تنفيذك الخاص ICollectionView الذي يقوم بالتصفية ورفع الأحداث حسب الضرورة.

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