Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

WPF 4.5: Live Shaping

Uno dei difetti che ha contraddistinto WPF fino alla sua versione 4.0 riguarda il fatto che l'interfaccia grafica non riflette automaticamente azioni di ordinamento, filtro e raggruppamento eseguite nei confronti di una ICollectionView o, più genericamente, di una collezione.

Il problema è definitivamente risolto in WPF 4.5 grazie a una nuova caratteristica nota come Live Shaping.

Ho sempre la stessa classe Contact, più una ObservableCollection chiamata Contacts:

Imports System.ComponentModel
 
Public Class Contact
    Implements System.ComponentModel.INotifyPropertyChanged
 
    Public Property LastName As String
    Public Property FirstName As String
 
    Private _age As Integer
    Public Property Age As Integer
        Get
            Return _age
        End Get
        Set(value As Integer)
            _age = value
            RaiseEvent PropertyChanged(MeNew PropertyChangedEventArgs("Age"))
        End Set
    End Property
 
    Public Event PropertyChanged(sender As Object, e As ComponentModel.PropertyChangedEventArgsImplements ComponentModel.INotifyPropertyChanged.PropertyChanged
End Class
 
Public Class Contacts
    Inherits System.Collections.ObjectModel.ObservableCollection(Of Contact)
 
End Class

A differenza del passato, abbiamo ora a disposizione un tipo chiamato ICollectionViewLiveShaping, che si usa come una ICollectionView ma che supporta anche delle proprietà booleane chiamate IsLiveSorting, IsLiveFiltering, IsLiveGrouping che, se impostate a True, permettono alla UI di aggiornare automaticamente la presentazione dei dati. Ipotizzando di avere una Window qualunque, supponiamo di popolare una collezione di contatti in questo modo:

    Private Sub LiveShapingWindow_Loaded(sender As Object, e As RoutedEventArgsHandles Me.Loaded
        Dim cnt As New Contacts
        cnt.Add(New Contact With {.Age = 34, .FirstName = "Alessandro", .LastName = "Del Sole"})
        cnt.Add(New Contact With {.Age = 44, .FirstName = "Renato", .LastName = "Marzaro"})
        cnt.Add(New Contact With {.Age = 18, .FirstName = "Contatto", .LastName = "AppenaMaggiorenne"})
 
 
        Dim view = CType(CollectionViewSource.GetDefaultView(cnt), ICollectionViewLiveShaping)
        view.IsLiveSorting = True
        Me.DG1.ItemsSource = cnt
 
        view.IsLiveFiltering = True
    End Sub

Dove DG1 è una semplice DataGrid definita, lato XAML, in questo modo (con colonne auto-generate per velocità):

 

<DataGrid AutoGenerateColumns="True" Name="DG1" ItemsSource="{Binding}" IsReadOnly="True"/>

Come potete vedere la ICollectionViewLiveShaping si usa in un modo che già conosciamo ma, impostandone la proprietà di interesse su True, otterremo finalmente l'effetto desiderato.

Alessandro

Print | posted on domenica 12 febbraio 2012 17:31 | Filed Under [ Windows Presentation Foundation ]

Powered by:
Powered By Subtext Powered By ASP.NET