Resumé

Silverlight DataForm DataField vs PasswordBox

Cristian Merighi () 0,00

Come ovviare alla generazione di un Textbox in corrispondenza di un campo del DataForm che prevederebbe invece un PasswordBox.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.

Premessa: alcune volte fatico a giustificare alcune carenze d'implementazione in scenari tutto sommato chiari e facili a definirsi. Altre volte devo ammettere di restare di stucco, basito, di fronte ad alcune soluzioni avveniristiche e geniali.

Si parla dei prodotti Microsoft® ovviamente. In questi giorni di totale schiacciante marasma su nuove "opportunità" di sviluppo, mirabolanti tecnologie e fuorvianti politiche aziendali, risulta piuttosto complicato stilare una lista di priorità riguardo a cosa imparare, come implementare e dove investire... a breve?!

Per foruna ci pensano i soliti immancabili grigi problemi della nostro quotidiano (che riguardano ovviamente tecnologie che padroneggiamo già da tempo e che quasi ci tèdiano ormai) a scuoterci con più pressanti dilemmi, del tipo: ma perché ca...spita non tappano questa noiosa falla qui?!

La falla cui mi riferisco (e che più propriamente definirei "svista") riguarda l'amato/odiato (più odiato) DataForm control distribuito tramite il Silverlight Toolkit.
Perché ca...(e 2!) 'sto DataField non mi si autogenera in maniera appropriata proponendomi un bel PasswordBox control invece di un TextBox, quando ho espressamente decorato la corrispondente proprietà con l'elegante DataTypeAttribute?

Presto detto: non ne tiene conto. Il metodo che autogenera il DataField non tiene conto di questo meta attributo. Il riferimento è a <private bool GenerateField(Type propertyType, string propertyName, BindingMode bindingMode, Panel panel)> nella classe System.Windows.Controls.DataForm (utilizzate ILSpy o equivalente per ispezionare).

Come pezzare alla bell'e meglio questa falla? Sempre grazie ad ILSpy mi sono arrabattato ed ho pensato di intervenire nel momento l'evento AutoGeneratingField del DataForm viene lanciato. Con un'accortezza:

C#
  1. private void loginDataForm_AutoGeneratingField(object sender, DataFormAutoGeneratingFieldEventArgs e)
  2. {
  3.     if (e.PropertyName == LoginInfoViewModel.PASSWORD_FIELD)
  4.     {
  5.         // take care of the bindings already set in
  6.         // System.Windows.Controls.DataForm //-> private bool GenerateField(Type propertyType, string propertyName, BindingMode bindingMode, Panel panel)
  7.         var binding = e.Field.Content.GetBindingExpression(TextBox.TextProperty).ParentBinding;
  8.         // the idea is to "switch" the current TextBox control
  9.         // replacing it with a PasswordBox
  10.         var pbox = new PasswordBox();
  11.         pbox.SetBinding(PasswordBox.PasswordProperty, binding);
  12.         e.Field.Content = pbox;
  13.     }
  14. }

Spero possa essere utile.

Take care. Bye.

feedback
 

Syndicate

Autore

Cristian Merighi facebook twitter google+ youtube

Ultimi articoli

Top rated

Archivio

Dove sono?

Autore

Cristian Merighi facebook twitter google+ youtube

Le mie letture

Feeds