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

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: data-binding verso proprietà statiche

In WPF 4.5 viene aggiunto il supporto per il data-binding anche nei confronti di proprietà statiche (shared in VB) delle nostre classi.

Questa peculiarità è stata richiesta a gran voce da molti e Microsoft ha deciso di accoglierla nella nuova versione di WPF. L'utilizzo è abbastanza semplice e si può scegliere tra due approcci che ora andiamo ad esaminare. Consideriamo la seguente classe, che espone due proprietà statiche di pura fantasia:

Imports System.ComponentModel
 
Public Class StaticModel
 
    Public Shared Event ValoreCondivisoChanged As EventHandler
 
    Private Shared _valoreCondiviso As String
    Public Shared Property ValoreCondiviso As String
        Get
            Return _valoreCondiviso
        End Get
        Set(value As String)
            If value <> _valoreCondiviso Then
                _valoreCondiviso = value
                RaiseEvent ValoreCondivisoChanged(NothingEventArgs.Empty)
            End If
        End Set
    End Property
 
    Public Shared Event StaticPropertyChanged As EventHandler(Of PropertyChangedEventArgs)
 
    Private Shared _velocità As Double
    Public Shared Property Velocità As Double
        Get
            Return _velocità
        End Get
        Set(value As Double)
            _velocità = value
            NotifyStaticPropertyChanged("Velocità")
        End Set
    End Property
 
    Private Shared Sub NotifyStaticPropertyChanged(propertyName As String)
        RaiseEvent StaticPropertyChanged(NothingNew PropertyChangedEventArgs(propertyName))
    End Sub
End Class

Le implementazioni delle due proprietà sono accomunate dal fatto che entrambe devono scatenare un evento che farà sapere all'interfaccia grafica che i dati sono cambiati. Ciò premesso, nella prima proprietà si dichiara un evento non generico (in senso .NET ) e questo evento viene scatenato al variare dei dati. Poichè è un tipo EventHandler, questo approccio non è considerato 'astratto' o riutilizzabile, ma specifico per la singola proprietà.

Nel secondo caso c'è invece un evento generico chiamato StaticPropertyChanged, la cui implementazione richiama il comportamento della ben nota INotifyPropertyChanged e permetterà di notificare alla UI le modifiche attraverso un approccio generico e passando informazioni addizionali. Vedremo poi lato XAML la differenza sostanziale tra i due.

Il binding lato XAML funziona in modo identico a come già conosciamo, con una piccola differenza sintattica. Nel caso specifico dichiaro un namespace XML che mi permetta di accedere alle proprietà:

xmlns:local="clr-namespace:WpfApplication1"

Supponiamo poi di avere alcuni controlli utente che debbano essere collegati in binding con le proprietà di cui sopra:

    <StackPanel>
        <TextBox Text="{Binding Path=(local:StaticModel.ValoreCondiviso), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="100" Height="30"/>
        <TextBlock Text="{Binding Path=(local:StaticModel.Velocità)}" Width="100" Height="30"/>
        <Button Content="Button" HorizontalAlignment="Left" Height="29" Margin="43,192,0,0" VerticalAlignment="Top" Width="200" Click="Button_Click"/>
    </StackPanel>

NOTA BENE: Nella prima develope preview di VS 11, il codice di cui sopra fa comparire un errore nel designer, ma dovete ignorarlo. E' un problema già noto e si verifica anche se la sintassi è corretta.

Possiamo quindi notare che:

  1. la sintassi vuole che dopo Path, ci sia una coppia di parentesi tonde all'interno della quale la proprietà statica è raggiungibile nella forma namespace:NomeClasse.NomeProprietà
  2. nel caso dell'approccio con evento non generico, si esplicità l'UpdateSourceTrigger come PropertyChanged (atteso che l'evento non generico non si comporta come l'altro che richiama il meccanismo delle notifiche)

Vi basta modificare a runtime i valori delle due proprietà e rendervi conto come in effetti il data-binding funzioni nel modo atteso.

Alessandro

Print | posted on lunedì 20 febbraio 2012 17:58 | Filed Under [ Windows Presentation Foundation ]

Powered by:
Powered By Subtext Powered By ASP.NET