سؤال

أعتقد أنها مشكلة شائعة في سيناريوهات DataBinding. ماذا تفعل عادة، إذا كنت تقوم بتشغيل تحديث دفعة وترغب في تجنب حسابات / إجراءات / تصرفات / تصرفات / أماكن مهما تم تنفيذها لكل تحديث واحد؟

أول شيء يأتي عادة إلى ذهني، هو إما أن يقدم منطقية جديدة أو غير قابلة للتفايك / هوك EventHandler، ...

ما لا أحب بهذه الأساليب هو:

  • أنها تعرض تعقيدا جديدا (يجب الحفاظ عليه، ...)
  • إنهم عرضة للخطأ، لأن عليك التأكد من إرسال إشعارات مكتظة بعد ذلك

أنا أتساءل ما إذا كان شخص ما يعالج هذه المشكلة بالفعل بطريقة أكثر ملاءمة من السهل التعامل معها؟

تيا مارتن

تحرير: عدم تفكيري. وأنا أعلم عن الأشياء التي توفرها .NET مثل RAISELISTCHangEdevents من قائمة Bindinglist، ... كلها تتناول المشكلة في أكثر / أقل بنفس الطريقة التي وصفتها، لكنني أبحث عن طريقة مختلفة لا يجب أن يكون لها عيوب مدرجة وبعد ربما أنا على المسار الخطأ، لكنني على الرغم من أنني أعطيها هنا ...

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

المحلول

لا يوجد حل واحد واحد يناسب الجميع، لسوء الحظ. لقد تقدمت بالحلول التالية أو رأيتها:

  1. هناك اثنين من السنانين. يتم تنظيم إشارة واحدة عندما يأتي التغيير من إجراء المستخدم، والآخر دائما حرير. يتيح ذلك التمييز بين التغييرات في UI والتحديثات حسب الرمز.

  2. منطقية لحماية التعليمات البرمجية

  3. توقف إطار عمل العقار عن الأحداث الانتشار تلقائيا عند عدم تغيير القيمة حقا.

  4. طريقة تجميد / ذوبان الجليد على الإشارة أو مدير الإشارة (أي الإطار بأكمله)

  5. طريقة لدمج الإشارات في واحد واحد. يمكنك القيام بتحديثات N ويحصلون على إشارات M حيث M <= n. إذا قمت بتغيير نفس الخاصية 100 مرة، لا تزال تحصل على إشارة واحدة فقط.

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

  7. API لتعيين العديد من القيم في وقت واحد؛ فقط إشارة واحدة تنبعث.

  8. يمكن لإطار الإشارة إرسال إشارات على مستويات مختلفة من الحبيبية. قل لديك شخص به اسم. عند تغيير الاسم، يمكنك الحصول على إشاراتين: واحدة لتغيير الاسم وتغيير "حقل مثيل" واحد ". لذلك إذا كنت تهتم فقط "يحتوي على شيء تغير"، فيمكنك ربطه في المثيل بدلا من جميع الحقول.

نصائح أخرى

ما هي منصة؟ المنشور يجعلني أفكر.

ما هي الكائنات الأساسية؟ علي سبيل المثال، BindingList<T> كمصدر يسمح لك بتعطيل الإخطارات عن طريق الإعداد RaiseListChangedEvents إلى false أثناء القيام التحديث.

بخلاف ذلك (أو ما شابه)؛ نعم، افصل التجليد أثناء التحديثات الكبيرة

أسهل طريق يأخذ هو استخدام BindingSource مكون لملزمة البيانات الخاصة بك. بدلا من ربط عناصر التحكم الخاصة بك إلى كائن معين (أو Ilist)، استخدم هذا الكائن كما DataSource ل BindingSource, ، ثم ربط الضوابط إلى BindingSource.

ال BindingSource الطبقة لديها SuspendBinding() و ResumeBinding() المهام.

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