Wpf TextBox.UndoLimit “sbomba” by design :-)
Un po’ di storia
Se cercate di fare questo:
con lo scopo di disabilitare il supporto per l’Undo offerto da Wpf, vi beccate una sonora exception “Cannot use UndoService while it is disabled”… l’inghippo è che quella cosa sbomba da paura a runtime se avete impostato un Binding sulla proprietà Text. Lo snippet qui sotto, grabbato con Reflector, spiega molto bene il problema:<TextBox UndoLimit="0" Text="{Binding DataSource.Zone, ...
Quella chiamata a Clear() scoppia perchè avete impostato UndoLimit a “0” disabilitando di fatto l’UndoManager.
Possibili Workaround
San Google propone una serie di possibili soluzioni:
(fonte)
Come lo stesso autore dice, non funziona :-), e ne propone un’altra:
Ma sinceramente a me non va neanche questa, nonostante in molti siano decisamente soddisfatti, non ho errori semplicemente non succede nulla.
Un terzo, fallimentare tentativo, è stato creare una Attached Property che impostasse l’UndoLimit dopo l’evento Loaded, perchè alla fine il problema sta proprio li, ma anche questo fallisce perchè in fase di Unload del controllo la proprietà Text viene resettata e quindi il codice cerca di fare nuovamente il reset (Clear()) dell’UndoManager.
Alla fine, partendo da un hint trovato sui Microsoft Forum, la pezza definitiva è questo Behavior:
che utilizzato così:public sealed class DisableUndoManagerBehavior : Behavior<TextBox> { protected override void OnAttached() { base.OnAttached(); var cb = new CommandBinding(); cb.Command = ApplicationCommands.Undo; cb.CanExecute += ( s, e ) => e.CanExecute = this.AssociatedObject.IsFocused; cb.Executed += ( s, e ) => e.Handled = true; this.AssociatedObject.CommandBindings.Add( cb ); } }
produce l’effetto desiderato, in realtà l’UndoManager non viene disabilitato ma semplicemente reso innoquo.<TextBox Text="{Binding DataSource.Zone}"> <i:Interaction.Behaviors> <behaviors:DisableUndoManagerBehavior /> i:Interaction.Behaviors> TextBox>
…e Wpf 4.0?
Funziona come si deve senza costringerci a fare i salti mortali, e il fido Reflector conferma:
Vi chiederete… perchè devi disabilitare il suppporto per l’Undo? perchè se avete un vostro motore per gestire il change tracking… ;-)
.m