In WinRT, così come in WPF e Windows Phone, non è possibile fare il binding nei converter del ConverterParameter: come è possibile ovviare e fare un binding con più parametri?
Si prenda questo esempio:
<converter:MyConverter x:Key="MyConverter" /> <TextBlock Text="{Binding Title, Converter={StaticResource MyConverter}, ConverterParameter={Binding Subtitle}}" />
In questo caso abbiamo la necessità di fare il binding ad una TextBlock con la proprietà Title, che deve essere elaborata dal converter in base ad un parametro che è a sua volta in binding con la proprietà Subtitle.
Questo scenario non è attualmente sfruttabile, perché, andando a debuggare ci si accorge che, nonostante non ci siano problemi, la proprietà parameter nella funzione di conversione è sempre null.
La ragione principale è che il ConverterParameter non è una DependencyProperty, ma un semplice object, e quindi non è possibile utilizzare il binding.
L'idea più semplice è quella di creare una DependencyProperty per ogni parametro che si desidera avere al posto del ConverterParameter.
Per fare questo bisogna però far ereditare il converter, oltre che da IValueConverter, anche da DependencyObject.
public class MyConverter : DependencyObject, IValueConverter { public string ConverterParameter { get { return (string)GetValue(ConverterParameter Property); } set { SetValue(ConverterParameter Property, value); } } public static readonly DependencyProperty ConverterParameter Property = DependencyProperty.Register("ConverterParameter", typeof (string), typeof (MyConverter), new PropertyMetadata(null)); public object Convert(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } }
Una volta fatto questo, modifichiamo la dichiarazione del converter e della TextBlock come segue:
<converter:MyConverter x:Key="MyConverter" ConverterParameter="{Binding Subtitle}" /> <TextBlock Text="{Binding Title, Converter={StaticResource MyConverter}}"/>
Come avete potuto notare, è possibile create tante DependencyProperty quanti sono i parametri di cui abbiamo bisogno in binding, evitando il limite (tra l'altro non supportato) di un solo elemento del ConverterParameter.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Implementare l'infinite scroll con QuickGrid in Blazor Server
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Cambiare la chiave di partizionamento di Azure Cosmos DB
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Inizializzare i container in Azure Container Apps
Usare il versioning con i controller di ASP.NET Core Web API
Generare file PDF da Blazor WebAssembly con iText
Aggiungere interattività lato server in Blazor 8
Utilizzare politiche di resiliency con Azure Container App
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
I più letti di oggi
- Utilizzare WebAssembly con .NET, ovunque
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzazione dei block template in Angular 17
- Disabilitare automaticamente un workflow di GitHub (parte 2)