Wpf Binding

venerdì 20 settembre 2013 - 23.22
Tag Elenco Tags  C#

first100 Profilo | Newbie

Salve,

Ho un pò di dubbi nel binding lato xaml , cioè se definisco un binding o un aproprietà come poi posso usarla nel codice?
Ho letto un pò di cose in giro ma ho ancora tanta confusione

Qualcuno mi illumina ?

Grazie :)

u235 Profilo | Junior Member

>Salve,
>
>Ho un pò di dubbi nel binding lato xaml , cioè se definisco un
>binding o un aproprietà come poi posso usarla nel codice?
>Ho letto un pò di cose in giro ma ho ancora tanta confusione
>
>Qualcuno mi illumina ?
>
>Grazie :)

Ciao,
non so se riesco ad illuminarti, ti dico solo la mia :D
un binding lato lato xaml non fa altro che legare una proprietà del DataContex a quel detto controllo, quindi le proprietà sono accessibili dalla classe che costituisce il DataContext.
Per capirci meglio :
Il DataContext può essere qualsiasi tipo, e i binding lato xaml si riferiranno alle sue proprietà. Ovviamente potrebbe fare da DataContext anche il tuo code behind, quindi in questo caso il binding si riferirebbe a delle prorietà di esso, ergo potresti lavorare sulla proprietà da codice nel DataContext.

In realtà credo vada detta una cosa : secondo me per sfruttare per bene il motore di binding di WPF è necessario lavorare con MVVM, quindi ti consiglierei di andare su questa strada.

first100 Profilo | Newbie

Grazie ma ad esempio io non ho ben chiaro il concetto di datacontext

u235 Profilo | Junior Member

Il DataContext è il contesto dati che viene associato ai controlli.
Ti faccio un esempio in cui uso come datacontext il code behind della windows stessa :


public partial class Window1 : Window { public Window1() { this.MyList = new List<string>(new string[] { "a", "b", "c" }); InitializeComponent(); } public List<string> MyList { get; set; } }
questo è il code behind di una window, come vedi ho scritto una proprietà di tipo List<string> che inizializzo con delle lettere, queste faranno da source per una listbox.


mentre questo è lo xaml :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ovviamente ho inserito nello xaml il binding del itemsource della listbox alla proprietà MyList, mentre come datacontext imposto il RelativeSource a Self che indica di utilizzare il code behind della window (DataContext="{Binding RelativeSource={RelativeSource Self}}").

first100 Profilo | Newbie

Ti ringrazio molto ho analizzato il codice ed ora ho le idee più chiare.

Un altra cosa che vorrei sapere è questa , se lato xaml scrivo ad esempio in uno user control che visulizza un documento o una immagine: <.... Source="{Binding path_of_file}" ...
nel codice come si può impostare la variabile path_of_file?

Grazie

u235 Profilo | Junior Member

Ciao,
il controllo Image ha la proprietà Source, questa è di tipo ImageSource, quindi puoi impostarla con un tipo BitmapSource.
Quando leggi nello xaml Source = "image.png", ovvero un percorso al posto del tipo ImageSource è perché viene poi caricato il file in runtime, il che significa che se vuoi fare il binding con una proprietà della classe che fa da DataContext devi crearla ad esempio di tipo BitmapImage e non di tipo stringa (con il percorso).
Oppure un altro modo per fare il binding può essere quello di creare una proprietà (sempre nel datacontext) di tipo string, ma in questo caso devi utilizzare un converter, ovvero una classe derivata da IValueConverter che esegua un override dei metodi Convert e ConvertBack, ad esempio :

file.cs
public partial class Window1 : Window { public Window1() { this.MyList = new List<string>(new string[] { "a", "b", "c" }); //Nome Immagine (con convertitore) this.NomeImmagine = "close"; //immagine presa da file (senza convertitore) this.ImageSource = new BitmapImage(new Uri("mioPath/miaImmagine.png")); InitializeComponent(); } public List<string> MyList { get; set; } ///con percorso stringa (con convertitore) public string NomeImmagine { get; set; } /// con immagine (senza stringhe e convertitori) public BitmapImage ImageSource { get; set; } }

Converter.cs
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

file.xaml
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

nell'esempio sopra do per scontato che ci sia una cartella Images nella soluzione, con queste vado a prendere il nome dal binding e lo uso come nome del file immagine, ma ovviamente deve essere presente... questo potrebbe essere comodo quando si vuole basare delle immagini in base ad esempio ad un nome, ma puoi anche farlo diversamente.

DA NOTARE NELLO XAML :
ho aggiunto un tag Converters che punta al namespace dei converters, ma il converter può essere anche nello stesso nameSpace locale, in quel caso non serve il tag converters ma userai il tag locale. Inoltre ho aggiunto nelle risorse della window il converter statico, infatti lo chiamo con StaticResource e il nome messo nella x:Key (Converter={StaticResource PathConverter})

un altro modo è quello di non usare il binding ed usare direttamente il nome file in stringa, ad esempio (sempre nella cartella images) :

<Image Source="/TuoNameSpace;component/Images/NomeFile.png" />

ovviamente se usi mvvm può andar bene solo con il convertitore.

first100 Profilo | Newbie

Grazie,

Mi sono studiato un pò il tuo codice , ho già le idee più chiare :).
C'è qualche altra risorsa come letture, libri, ecc. per il databinding da xaml che è il mio punto debole?

u235 Profilo | Junior Member

Figurati :)

ecco un link : http://msdn.microsoft.com/it-it/library/ms752347.aspx

ma sicuramente prima o poi vorrai approfondire con MVVM
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5