Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

WPF - sorting combobox items with a CollectionViewSource

Îåêßíçóå áðü ôï ìÝëïò adel. Τελευταία δημοσίευση από το μέλος adel στις 19-01-2010, 23:38. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-01-2010, 05:46 56486

    WPF - sorting combobox items with a CollectionViewSource

    Καλημέρα.

    Έχω ένα ComboBox το οποίο τραβάει data από ένα Linq to Sql table.
    Για να το γεμίσω χρησιμοποιώ έναν ObjectDataProvider και για να το σορτάρω ένα CollectionViewSource.
    Το ComboBox κανει bind στο CollectionViewsource.

    Το πρόβλημα είναι πως το ComboBox γεμίζει με τα data ακριβώς όπως έρχονται από τη βάση, χωρίς να σορτάρονται
    όπως περιγράφει το SortDescription του CollectionViewSource. Παραθέτω δείγμα xaml παρακάτω. Μπορεί κάποιος
    να μου εξηγήσει γιατί δεν δουλεύει το sort;

    Ευχαριστώ

    <Window x:Class="WpfTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTest" 
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.Resources>
                <ObjectDataProvider x:Key="item-categories" ObjectType="{x:Type local:DemoDBDataContext}" MethodName="GetTable" >
                    <ObjectDataProvider.MethodParameters>
                        <x:Type TypeName="local:ItemCategory" />
                    </ObjectDataProvider.MethodParameters>
                </ObjectDataProvider>
                <CollectionViewSource Source="{StaticResource item-categories}" x:Key="catId" >
                    <CollectionViewSource.SortDescriptions>
                        <scm:SortDescription PropertyName="CategoryId" Direction="Descending"/>
                    </CollectionViewSource.SortDescriptions>
                    <CollectionViewSource.GroupDescriptions></CollectionViewSource.GroupDescriptions>
                </CollectionViewSource>
            </Grid.Resources>
            <ComboBox   TextSearch.TextPath="CategoryId" ItemsSource="{Binding Source={StaticResource catId}}" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="comboBox1" VerticalAlignment="Top" Width="52" IsEditable="True" IsReadOnly="False" >
                <ComboBox.ItemTemplate>
                    <DataTemplate >
                        <StackPanel Orientation="Horizontal"  >
                            <TextBlock Text="{Binding Path=CategoryId}" Width="20" />
                            <TextBlock Text=" | " />
                            <TextBlock Text="{Binding Path=Description}" Width="100" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            
        </Grid>
    </Window>

  •  19-01-2010, 10:21 56488 σε απάντηση της 56486

    Απ: WPF - sorting combobox items with a CollectionViewSource

    Ως προς ποιο property θέλεις να κάνεις το sorting; Έτσι όπως είναι γραμμένο, η ταξινόμηση γίνεται με βάση το CategoryId. Ρϊξε μια ματιά κι εδώ.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  19-01-2010, 20:25 56497 σε απάντηση της 56488

    Απ: WPF - sorting combobox items with a CollectionViewSource

    Markos, ευχαριστώ που ασχολήθηκες κατ' αρχήν.

    > Ως προς ποιο property θέλεις να κάνεις το sorting; Έτσι όπως είναι γραμμένο, η ταξινόμηση γίνεται με βάση το CategoryId.

    Θα έπρεπε να γίνεται, αλλά δε γίνεται. Εκεί είναι το θέμα :)

    Anyways, νομίζω πως έβγαλα μια άκρη.

    Η GetTable που καλεί ο ObjectDataProvider επιστρέφει ένα instance τύπου System.Data.Linq.Table<ItemCategory>. To view που
    δημιουργεί το CollectionViewSource όταν διαβάζει αυτό το instance είναι τύπου BindingListCollectionView και εκεί δείχνει να είναι
    το πρόβλημα. Σύμφωνα με διάφορους τύπους που γράφουν στο ίντερνετ (πόσο έγκυρο reference!), ένα BindingListCollectionView
    δεν μπορεί να σορτάρει τα data, πρέπει να είναι ήδη σορταρισμένα. Για να διασκεδάσουμε περισσότερο, δεν προκύπτει κανένα μήνυμα
    λάθους, το SortDescription απλά αγνοείται.

    Μετά από διάφορα πειράματα, κατέληξα στο εξής workaround:

    Η εξής συνάρτηση

            public ObservableCollection<ItemCategory> GetCategories()
            {
                return new ObservableCollection<ItemCategory>(base.GetTable<ItemCategory>());
            }

    γραμμένη σαν extension του DemoDBDataContext, παίρνει το Table<ItemCategory> και το επιστρέφει σαν ObservableCollection
    στον καλούντα ObjectDataProvider. Τώρα το view του CollectionViewSource είναι τύπου ListCollectionView και το sort δουλεύει
    μια χαρά.

    Ουφ!

  •  19-01-2010, 20:43 56498 σε απάντηση της 56497

    Απ: WPF - sorting combobox items with a CollectionViewSource

    Δεν παίρνω και όρκο, αλλά μάλλον δε χρειάζεται το work around. Το BindingListCollectionView έχει SortDescriptions property.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  19-01-2010, 21:30 56502 σε απάντηση της 56498

    Απ: WPF - sorting combobox items with a CollectionViewSource

    Αυτός είναι και ο λόγος που δεν μπορούσα να καταλάβω γιατί αγνοείται το SortDescription που ορίζω, ενώ εμπεριέχεται στο property SortDescriptions που δείχνεις.

    Ένα κρατούμενο είναι στα remarks εδώ: All collections have a default CollectionView. For collections that implement IBindingListView or IBindingList, the default collection view
    is BindingListCollectionView. Specifically, IBindingList is required for BindingListCollectionView, and IBindingListView is an optional interface that gives additional sorting and filtering support.

    Η μόνη υπόθεση που μπορώ να κάνω (straight out of my ass!) είναι ότι το BindingList που επιστρέφει ένα Table(TEntity) δεν υλοποιεί το προαιρετικό IBindingListView με αποτέλεσμα να
    μη δουλεύει το sort.

    Εσένα ο συνδιασμός Table(TEntity) <- ObjectDataProvider <- CollectionViewSource <- Sorted Items Control σου δουλεύει;


  •  19-01-2010, 22:04 56504 σε απάντηση της 56502

    Απ: WPF - sorting combobox items with a CollectionViewSource

    Το SortDescriptions του BindingListCollectionView κάνει override το SortDescriptions του CollectionView. Αυτό αναφέρεται στο πρώτο από τα δύο links που σου έδωσα παραπάνω (αν scroll-άρεις και διαβάσεις την περιγραφή του SortDescriptions property). Ίσως γι' αυτό πρέπει να το καθορίσεις explicitly στο BindingListCollectionView.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  19-01-2010, 22:31 56505 σε απάντηση της 56504

    Απ: WPF - sorting combobox items with a CollectionViewSource

    Το δοκίμασα και αυτό. To SortDescription εξακολουθεί να αγνοείται.

    Μόλις βρω χρόνο θα κοιτάξω στον Reflector την Table<TEntity>.GetNewBindingList για να δω αν το to object που επιστρέφεται υλοποιεί το IBindingListView.
    Ως τότε θα ζήσω με τo overhead του conversion από Table σε ObservableCollection. Τα data δεν είναι πολλά οπότε δε με πολυπειράζει προς το παρόν.

    Ευχαριστώ
  •  19-01-2010, 22:34 56506 σε απάντηση της 56505

    Απ: WPF - sorting combobox items with a CollectionViewSource

    adel:

    Το δοκίμασα και αυτό. To SortDescription εξακολουθεί να αγνοείται.

    Αυτό είναι πράγματι ενδιαφέρον και περίεργο...


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  19-01-2010, 23:02 56508 σε απάντηση της 56505

    Απ: WPF - sorting combobox items with a CollectionViewSource

    adel:

    Μόλις βρω χρόνο θα κοιτάξω στον Reflector την Table<TEntity>.GetNewBindingList για να δω αν το to object που επιστρέφεται υλοποιεί το IBindingListView.

    Με βάση αυτό το thread, απ' ό,τι φαίνεται η αρχική σου υποψία είναι σωστή. Συγγνώμη για το απανωτό post.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  19-01-2010, 23:38 56509 σε απάντηση της 56508

    Απ: WPF - sorting combobox items with a CollectionViewSource

    No worries.

    Είναι πάντως κρίμα/εκνευριστικό/βάλε-ότι-θες να μην δουλεύει ένα τόσο απλό σενάριο out of the box. Έχω δύο-τρεις μέρες που ασχολούμαι με το WPF και μου
    αρέσει πολύ σαν τεχνολογία. Κάτι τέτοια όμως με κάνουν να αναρωτιέμαι τι άλλο θα με ταλαιπωρήσει στο μέλλον.  Μάλλον κάποια πράγματα, όπως η ταλαιπωρία
    που τρώμε με κάθε καινούργια και πολλά υποσχόμενη τεχνολογία, δεν θα αλλάξουν ποτέ.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems