Xamarin.forms: [اقتراح] تنفيذ CollectionViewSource

تم إنشاؤها على ٢٧ مارس ٢٠١٨  ·  20تعليقات  ·  مصدر: xamarin/Xamarin.Forms

وصف

تشتمل تقنيات Microsoft الرئيسية القائمة على XAML مثل Silverlight و WPF و UWP على فئة تسمى CollectionViewSource. نماذج Xamarin لا. تعد واجهة INotifyCollectionChanged واجهة مهمة جدًا بين النماذج وواجهة المستخدم. تمكّن الواجهة واجهة المستخدم من التحديث دون مسح عناصر قائمة العناصر تمامًا وإعادة بناء هذه العناصر من نقطة الصفر في كل مرة تتم فيها إضافة عنصر أو إزالته. هذا يحسن الأداء والاستجابة.

يهدف CollectionViewSource إلى توفير تطبيق مشترك لـ INotifyCollectionChanged عبر التقنيات ، وأيضًا إلى توفير وظائف التصفية والفرز المشتركة عبر عناصر التحكم عبر واجهة INotifyCollectionChanged. عندما لا يكون CollectionViewSource متاحًا ، يجب أن يقوم عنصر التحكم بتنفيذ التصفية والفرز بنفسه والذي يعد اختراقًا إلى حد ما. على سبيل المثال ، يحتوي ListView على هذه الخاصية (https://developer.xamarin.com/api/property/System.Windows.Forms.ListView.Sorting/).

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

قد تحتاج العديد من عناصر التحكم في مجموعة أدوات XF مثل ListView و Picker وما إلى ذلك إلى تنفيذ الوظيفة بطريقة ما. كان الاستخدام الأكثر شيوعًا للفصل على الأنظمة الأساسية الأخرى هو DataGrids ولكن هذا غير موجود في مجموعة أدوات XF القياسية. ومع ذلك ، يمكن جعل عناصر تحكم الطرف الثالث مثل SyncFusion DataGrid متوافقة مع معايير Microsoft القياسية إذا كانت هذه المعايير موجودة لنماذج Xamarin.

مقالة MSDN
https://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource (v = 110) .aspx

عينات WPF
https://github.com/Microsoft/WPF-Samples/tree/master/Data٪20Binding/CollectionViewSource

مقالة:
https://www.hanselman.com/blog/CollectionViewSourceIsCrazyUsefulForBindingToFilteredObservableCollectionsOnWindowsPhone8.aspx

collectionview high impact proposal-open enhancement ➕

التعليق الأكثر فائدة

هذا مطلوب للغاية .

ال 20 كومينتر

يستمع ListViews و Pickers وبعض عناصر التحكم الأخرى بالفعل إلى أحداث INCC

StephaneDelcroix ، هذا عادل بما فيه الكفاية - كما ينبغي. ولكن ما هو مطلوب أعلى بكثير مما توفره وظيفة INotifyCollectionChanged القياسية. كنقطة أساسية ، لا يعد INCC مفيدًا جدًا بدون فرز القوائم المضمنة. إذا قمت بالالتزام بـ ObservableCollection <> ، فكيف من المفترض أن تقوم بفرز المحتويات؟ حسنًا ، يمكنك إجراء فرز فقاعي يدوي ، ولكن استدعاء Enumerable. لن يساعدك الأمر (TSource ، TKey) لأنك ستنتهي بـ IEnumerable جديد والذي سيؤدي إلى تحديث كامل على أي حال.

لطالما كانت CollectionViewSource جزءًا كبيرًا من تقنيات XAML لتوفير حل للمشكلة التي ذكرتها للتو. بدونها ، سنحتاج إلى كتابة تعليمات برمجية لفرز القوائم مثل ObservableCollection <> لإطلاق عملية الفرز. ولكن حتى ذلك الحين ، تأتي مشكلة الآثار الجانبية. بدون CollectionViewSource ، تفتقد XF جزءًا كبيرًا من الوظائف التي تأتي بشكل قياسي مع تقنيات XAML الأخرى.

هذا لا يتطرق حتى إلى التصفية والتجميع ... بدون ذلك ، ستنطلق جميع عناصر تحكم XF ، بما في ذلك عناصر تحكم الطرف الثالث مثل SyncFusion ، في ظلها الخاص ، ومن ثم لن يكون أي منها متوافقًا مع النظام القياسي الذي تم استخدامه. جزء من نظام XAML البيئي منذ WPF.

جانبا ، يمارس رؤسائي ضغوطا علي باستمرار لتقديم الفرز القابل للتكوين والتصفية والتجميع وما إلى ذلك. لذلك ، قدمنا ​​لهم حلولًا جزئية في تطبيقنا باستخدام الكود الخاص بنا. لكنها لا تقدم أي شيء مثل ما كان متاحًا في Silverlight و WPF. لقد اضطررنا إلى استخدام عناصر تحكم SyncFusion في الأماكن التي تنحرف عن نموذج Microsoft تمامًا للحصول على الوظيفة. مرارًا وتكرارًا ، واجهنا أعطالًا وما إلى ذلك بسبب عناصر التحكم هذه ، لذا لا يمكننا الاعتماد عليها.

CollectionViewSource هو مطلب أساسي لمساحة تقنية XAML.

INCC! = CollectionViewSource

هل هناك ما يمنعك من كتابة CollectionViewSource ؟

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

لن يكون أي منها متوافقًا مع النظام القياسي

ما التوافق الذي تشير إليه؟ فقط الصيغة العامة التي اتخذتها XAML لـ CollectionViewSources؟

ما هو حجم المجموعات التي تعمل ضدها؟

إذا قمت بالالتزام بـ ObservableCollection <> ، فكيف من المفترض أن تقوم بفرز المحتويات؟

معظم عمليات التنفيذ التي رأيتها تستخدم قائمة الوكيل ReadOnly .. ReactiveList ، DynamicData ، وأنا متأكد تمامًا من أن CollectionViewSource تفعل ذلك أيضًا مع ICollectionView التي تعرضها. لا يعمل مقابل قائمة المصادر ، فهو يعرض قائمة المصادر على طريقة عرض للقراءة فقط. تتم مزامنة التحديثات الصغيرة فقط ولكن التحديثات الأكبر تتسبب فقط في إعادة التعيين والتحديث.

أدرك أنه إذا لم تكن من المعجبين المتفاعلين ، فهذه ليست بداية
https://github.com/RolandPheasant/DynamicData
إنه أمر مذهل ولم أواجه مشكلة في التعامل مع مجموعات البيانات الأكبر حجمًا

لقد حددت هذا الاقتراح مفتوحًا لأنني أشعر بالفضول قليلاً بشأن هذا الاقتراح.

تضمين التغريدة

هل هناك أي شيء يمنعك من كتابة CollectionViewSource الخاصة بك؟

هناك تطبيقات يجب مراعاتها على جانبي الفصل. أي أن الفصل نفسه يحتاج إلى الفرز والتصفية والتجميع ، والتي نعم ، يمكننا أن نكتب أنفسنا. لكن هذا فقط جزء من المعادلة. تحتاج الضوابط إلى تنفيذ منطق لتوجيه الفرز والتصفية وما إلى ذلك. على سبيل المثال ، في WPF و Silverlight ، ستتفاعل DataGrids مع CollectionViewSource عند النقر فوق رأس عمود معين. هذا من شأنه أن يتسبب في اللجوء إلى العمود. لا تحتوي نماذج Xamarin حاليًا على DataGrid رسمي. ولكن ، أحد الآثار الجانبية لعدم وجود DataGrid يعني أن الأطراف الثالثة مثل SyncFusion قد كتبت DataGrid الخاصة بهم. لا يوجد شيء خاطئ في DataGrid الخاصة بهم في حد ذاتها ، لكنهم لم يفصلوا عن سيطرتهم مع Microsoft CollectionViewSource قياسي. كل منطق الفرز الخاص بهم مبني على سيطرتهم ولا يتم مشاركته مع أي عناصر تحكم أخرى. لذا ، إذا أردنا وظيفة الفرز الخاصة بهم ، فعلينا استخدام سيطرتهم ، أو لا نستخدم أي شيء على الإطلاق. حتى إذا كتبنا نسختنا الكاملة من CollectionViewSource ، فسنظل بحاجة إلى إنشاء شيء مثل DataGrid الخاصة بهم من أجل التقاط حدث النقر فوق رأس العمود ، وتعيين عمود الفرز على CollectionViewSource.

لا تحتاج نماذج Xamarin إلى إنشاء DataGrid حتى يكون هذا مفيدًا. يمكن أن يكون مفيدًا لـ ListViews و Pickers وما إلى ذلك ، ولكن يلزم تنفيذ عناصر تحكم ووظائف أخرى. على سبيل المثال ، في تطبيقنا ، أنشأنا شيئًا مشابهًا جدًا لمصدر CollectionViewSource على مستوى أساسي (فئة متوسطة). لقد أنشأنا ButtonBehaviors عند إرفاقه ، قم بتعيين عمود الفرز على الفئة المتوسطة والسماح بالفرز بشكل مستقل عن مجموعة المستوى الأساسي.

هذه بنية تحتية أكبر بكثير من فئة واحدة فقط. في أنظمة XAML الأخرى ، لا تعد CollectionViewSource فئة معزولة. يتفاعل مع الفئات الأخرى بطرق محددة. يجب أن تكون هناك مجموعة من الضوابط والسلوكيات والأوامر وما إلى ذلك لهذه الوظيفة. على سبيل المثال ، قد يكون هناك ، Action Sheet الذي يعرض قائمة بأسماء الخصائص (حسب الاسم المستعار) ، وعندما يحدد المستخدم عنصرًا من القائمة ، يقوم CollectionViewSource بتشغيل الفرز حسب تلك الخاصية.

إذا لم يتم تنفيذ ذلك قريبًا ، فإن عناصر تحكم الطرف الثالث وما إلى ذلك ستنطلق بشكل أكبر في الظل الخاص بها وستعمل على المزيد والمزيد من العمل لاختراق وظائف الفرز / التصفية الخاصة بكل عنصر تحكم. لن تتم مشاركة الكود عبر عناصر تحكم نوع القائمة وسيكون هذا سيئًا بشكل عام لنماذج Xamarin على المدى الطويل.

فيما يلي مثال على وظيفة الفرز التي تم تنفيذها لعنصر تحكم محدد ، ولكن لم تتم مشاركة هذه الوظيفة مع عناصر تحكم أخرى مماثلة: https://developer.xamarin.com/api/property/System.Windows.Forms.ListView.Sorting /

PureWeen ، ماذا عن هذا الموضوع يحتاج إلى معلومات؟ CollectionViewSource هو معيار Microsoft عبر التقنيات المستندة إلى XAML. ما المزيد من المعلومات التي تحتاجها؟

آسف ، لا بد أنني فاتني سؤالك هنا.

ما التوافق الذي تشير إليه؟ فقط الصيغة العامة التي اتخذتها XAML لـ CollectionViewSources؟

عبر WPF و Silverlight و UWP ، فإن عناصر التحكم التي تنفذ CollectionViewSource تعمل بنفس الطريقة. عندما يتم إدخال عنصر تحكم طرف ثالث (مثل SfDataGrid) لملء ثقب CollectionViewSource المفقود ، فإنه يجلب معه الفرز والتصفية والتجميع غير المتوافق مع وظائف CollectionViewSource القياسية القائمة على Microsoft XAML. سيكون دائمًا خاصًا بالطرف الثالث الذي يبني السيطرة

هذا مطلوب للغاية .

@jassmith thanks!

هيا يا رفاق ، هذا مطلوب للغاية. أعد بناء قائمة لأن مرشحًا أو ترتيبًا قد تغير بشدة.

انظر هنا: ليس حقا أفضل حل.
https://forums.xamarin.com/discussion/32481/observablecollection-with-filter

بالتأكيد مطلوب ، هذا عنصر مفيد للغاية في WPF وهو مفقود بشكل مؤلم في Xamarin.

كيف يتداخل طلب الميزة هذا مع عنصر تحكم Xamarin Forms 4.0 CollectionView الجديد ، والذي لا يشبه على الإطلاق WPF System.Windows.Data.CollectionView أو System.ComponentModel.ICollectionView؟

لقد بدأت للتو العمل مع نماذج Xamarin بعد سنوات من الخبرة مع WPF. وأشعر بخيبة أمل كبيرة لعدم وجود تطبيق CollectionViewSource في Xamarin.

جئت إلى هنا لأنني كنت أتساءل عما إذا كان هناك شيء مثل CollectionViewSource. هذه الميزات مهمة عند التفكير في التكنولوجيا (مثل Xamarin.Forms) لاستخدامها في بناء تطبيقات الأجهزة المحمولة.
طالما لا يوجد دعم مدمج ، فسوف يتعين علي الالتزام بالتنفيذ الخاص بي.

ما لم أفقد شيئًا ما ،

توجد وظيفة إضافية لـ UWP AdvancedCollectionView في WindowsCommunityToolkit ، والتي تضيف التجميع والفرز.

لست على دراية بالتفاصيل. أذكر فقط في حالة وجود فائدة في رؤية ما تم إنجازه هناك و / أو تنسيق حل قياسي مع الأشخاص العاملين في UWP.

أيضًا ، مناقشة SO لميزة UWP المفقودة وبعض محاولات التحسين. .

جئت هنا لأرمي قبعتي الافتراضية في حلقة "نحن بحاجة إلى هذا". تعد التصفية التلقائية والفرز والتجميع جزءًا أساسيًا من تجربة WPF / XAML لدرجة أنني أخدش رأسي وأتساءل لماذا حتى السؤال عما إذا كانت هناك حاجة إليها هنا في Xamarin أم لا.

jbhaywood إنه مطلوب تمامًا ، مثل الكثير من الأشياء الأخرى.

لسوء الحظ ، فإن شيئًا مثل CollectionViewSource ليس مثيرًا بدرجة كافية بحيث يمكن لموظف Microsoft التباهي به في منشور مدونة أو في مؤتمر. ونظرًا لأن Microsoft لا تستخدم Xamarin ، فهي تشكّل نفسها لمنتجاتها ، حتى أنها لا تشعر بنقاط الألم التي نواجهها نحن كمطورين.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات