في Silverlight، كيفية تعبئة DataGrid قابلة للفرز من اتصال تغيير حيوي

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

  •  04-07-2019
  •  | 
  •  

سؤال

ولدي مجموعة من البيانات التي يتم عرضها من الصفوف في DataGrid العناصر. وترتيب للصفوف يتغير استجابة لأحداث خارجية.

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

class MyCollection : ObservableCollection<T>
{
   void swap( int i, int j )
   {
      T tmp = this[i];
      this[i] = this[j]; // THROWS A NOT SUPPORTED EXCEPTION
      this[j] = tmp;
   }
}

ولذا فإن السؤال هو ... كيفية تعبئة DataGrid قابلة للالذي يحتاج إلى تحديث حيوي؟ ترتيب الصفوف

وأنا لم تحصل في النهاية على واحد عمل الجواب، وأنا أصف ذلك أدناه.

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

المحلول

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

class MyCollection<T> : List<T>, INotifyCollectionChanged
{
   public event NotifyCollectionChangedEventHandler CollectionChanged;

   private void swap( int i, int j )
   {
      T a = this[i];
      T b = this[j];

      // swap my own internal data storage
      this[i] = b;
      this[j] = a;

      // and also let my CollectionChanged listener know that I have done so.
      if( CollectionChanged != null )
      {
         NotifyCollectionChangedEventArgs arg;

         arg = new NotifyCollectionChangedEventArgs(
             NotifyCollectionChangedAction.Remove, a, i );
         CollectionChanged( this, arg );

         arg = new NotifyCollectionChangedEventArgs(
             NotifyCollectionChangedAction.Add, b, i );
         CollectionChanged( this, arg );

         arg = new NotifyCollectionChangedEventArgs(
             NotifyCollectionChangedAction.Remove, b, j );
         CollectionChanged( this, arg );

         arg = new NotifyCollectionChangedEventArgs(
             NotifyCollectionChangedAction.Add, a, j );
         CollectionChanged( this, arg );

      }

   }

}

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

public void ProcessUpdates( List<T> updateList )
{
    // use the contents of updateList to modify my internal store
    // ...


    // and now resort myself
    sort();
}

private void sort()
{
    // implement your favorite stable sorting algorithm here, calling 
    // swap() whenever you swap two elements.

    // (this is an intentionally facetious sorting algorithm, because I
    // don't want to get into the long and irrelevant details of my own 
    // data storage.)
    while( i_am_not_sorted() )
    {
       int i = random_index();
       int j = random_index();
       if( out_of_order(i,j) )
       {
          // modify my internal data structure and 
          // also let my CollectionChanged listener know that I have done so
          swap( i, j );
       }
    }
}

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

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