… che a casa mia si chiama BUG, e come tale è riconosciuto.
Un po’ di storia
Se cercate di fare questo:
<TextBox UndoLimit="0" Text="{Binding DataSource.Zone, ...
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:
image
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:
image
(fonte)

Come lo stesso autore dice, non funziona :-), e ne propone un’altra:
image
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:
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 );
    }
}
che utilizzato così:
<TextBox Text="{Binding DataSource.Zone}">
    <i:Interaction.Behaviors>
        <behaviors:DisableUndoManagerBehavior />
    i:Interaction.Behaviors>
TextBox>
produce l’effetto desiderato, in realtà l’UndoManager non viene disabilitato ma semplicemente reso innoquo.
…e Wpf 4.0?
Funziona come si deve senza costringerci a fare i salti mortali, e il fido Reflector conferma:
image
Vi chiederete… perchè devi disabilitare il suppporto per l’Undo? perchè se avete un vostro motore per gestire il change tracking… ;-)
.m