سؤال

عندما أقوم بتحميل البيانات لأول مرة إلى عنصر تحكم Silverlight DataGrid، كيف يمكنني جعل الشاشة تبدو تمامًا كما لو كان المستخدم قد نقر للتو على رأس العمود الأول؟بمعنى آخر، يجب فرز البيانات بترتيب تصاعدي وفقًا لقيم هذا العمود، ويجب عرض سهم الفرز الصغير في رأس العمود الأول.

بافتراض أن ذلك ممكن، هل يمكنني أيضًا أن أجعل الأمر يبدو كما لو أن المستخدم قد نقر على العمود الأول ثم نقر على العمود الثاني باستخدام مفتاح Shift؟بمعنى آخر، هل يمكنني تطبيق فرز من جزأين برمجيًا وجعل الشاشة تبدو كما لو أن المستخدم قد قام بذلك؟

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

المحلول

وكنت بحاجة للقيام بذلك أيضا، وبدا الجاد والعميق في ما إذا كانت في DataGrid يمكن أن تفعل هذا.

وهناك في الواقع الطريقة المناسبة على الطبقة DataGridColumnHeader، وهي InvokeProcessSort، ولكن من داخلي وليس على السطح في أي مكان آخر في صفوف DataGrid.

وكل ما استطعنا القيام به هو قبل فرز البيانات فقط قبل أن ربط ذلك. أنا باستخدام مجموعة بيانات مخصصة التي تطبق ICollectionView وكذلك ObservableCollection <>، وهذا يعمل OK - ولكنها ليست الأمثل، وحمولة من العمل الذي لا يحتاج بالضرورة

وبالإضافة إلى ذلك، توفر مجموعة ما قبل فرزها يعني أن الشبكة لا تظهر علامة الفرز.

وأنا سوف يثير هذا كقضية على في DataGrid علة تعقب - وهذا هو إغفال كبير إلى حد ما يهمني أن يكون من السهل جدا لإصلاح - MS يحتاج فقط إلى فضح الأساليب المناسبة على DataGridColumn والطبقات DataGrid

.

نصائح أخرى

وهذا هو بلدي الحل:

if (pcv.CanSort == true)
{
      pcv.SortDescriptions.Add(new SortDescription("ProductionStatus", ListSortDirection.Ascending));
      pcv.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending));
}

و، حيث PCV هو PageCollectionView. هذا فرز أول مرة من قبل الملكية ProductionStatus ومن ثم من قبل تاريخ الملكية. ويعرض هذا النوع القليل السهم فقط لالعمود الثاني بالرغم من ذلك.

وجدت مادة جيدة قليلا بول Sherrif أن تحل هذا بالنسبة لنا ...

HTTP: // المدونات. asp.net/psheriff/archive/2010/07/14/use-collectionviewsource-in-silverlight.aspx

وفي الأساس كنا ربط DataGrid إلى CollectionViewSource على أي حال. اتضح هذا له CollectionViewSource.SortDescriptions مجموعة من التهيئة التي تتيح لنا تحديد ترتيب الافتراضية.

وبفضل بول!

وببساطة إضافة SortDescriptor إلى DomainDataSource:

<riaControls:DomainDataSource.SortDescriptors>
    <riaControls:SortDescriptor PropertyPath="ColumnName" Direction="Descending" />
</riaControls:DomainDataSource.SortDescriptors>

يوجد CollectionViewSource في Silverlight 3+

http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource(v=vs.95).aspx

هناك طريقة سهلة لتحديد ترتيب الفرز الافتراضي في XAML، كما اقترحت Microsoft:

قم بتعريف الفرز في العلامات باستخدام CollectionViewSource

 <Window.Resources>
   <app:MyData x:Key="MyData"/>
   <CollectionViewSource x:Key="cvs" Source={StaticResource MyData}>
     <CollectionViewSource.SortDescriptions>
        <SortDescription Property="Name"/>
     </CollectionViewSource.SortDescriptions>
   </CollectionViewSource>
 </Window.Resources>

 <DataGrid ItemsSource="{Binding Source={StaticResource cvs}}"/> 

وجدت في التعليقات في https://connect.microsoft.com/VisualStudio/feedback/details/678782/set-default-sort-order-of-datagrid

تصحيح لي لعينة مايكروسوفت:

 <sort:SortDescription 
   PropertyName="Name"
   Direction="Ascending"
   xmlns:sort="clr-namespace:System.ComponentModel;assembly=System.Windows"
   /> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top