2012-02-10 18 views

Respuesta

10

No es posible cambiar el modo por defecto para el UpdateSourceTrigger en un estilo. Esto se configura como DefaultUpdateSourceTrigger de la clase FrameworkPropertyMetadata cuando se registra DependencyProperty (en este caso, la propiedad Text).

Puede crear un tipo de cuadro de texto personalizado que deriva de TextBox y cambia este valor al registrar la propiedad de dependencia. Alternativamente, es posible que desee buscar en el marco Caliburn.Micro MVVM, que establece automáticamente esto para todos los cuadros de texto en una aplicación (a través de código, como parte de su enlace basado en la convención).

+0

he actualizado la respuesta. – devdigital

+0

¿Has echado un vistazo al uso de un marco MVVM? Le ahorrará una gran cantidad de trabajo, y el enlace es una alegría con Caliburn.Micro. Si desea desplegar su propia solución, tal vez se pueda escribir una extensión de marcado personalizado o un enlace personalizado, en lugar de crear su propio tipo derivado de cuadro de texto. Eche un vistazo a http://www.paulstovell.com/wpf-delaybinding o http://www.hardcodet.net/2008/04/wpf-custom-binding-class para obtener algunas ideas. – devdigital

+0

¡Gracias por la respuesta! – syned

1

Sólo se extienden respuesta aceptada (y sí, sé que estoy necromancing esta pregunta :)):

En realidad, el propio cuadro de texto es bastante simple, permite llamarlo TextBoxExt (no mucho extendido, pero ya sabes ...)

public class TextBoxExt : TextBox 
{ 
    private static readonly MethodInfo onTextPropertyChangedMethod 
     = typeof(TextBox).GetMethod("OnTextPropertyChanged", BindingFlags.Static | BindingFlags.NonPublic); 
    private static readonly MethodInfo coerceTextMethod 
     = typeof(TextBox).GetMethod("CoerceText", BindingFlags.Static | BindingFlags.NonPublic); 
    static TextBoxExt() 
    { 

     TextProperty.OverrideMetadata(
     typeof(TextBoxExt), 

     // found this metadata with reflector: 
     new FrameworkPropertyMetadata(string.Empty, 
             FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, 
             new PropertyChangedCallback(MyOnTextPropertyChanged),callback 
             new CoerceValueCallback(MyCoerceText), 
             true, // IsAnimationProhibited 
             UpdateSourceTrigger.PropertyChanged) 
     ); 
    } 

    private static object MyCoerceText(DependencyObject d, object basevalue) 
    { 
     return coerceTextMethod.Invoke(null, new object[] { d, basevalue }); 
    } 

    private static void MyOnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     onTextPropertyChangedMethod.Invoke(null, new object[] { d, e }); 
    } 

    } 

y en algún lugar en su ResourceDictionary {} .xaml o en App.xaml:

<Style TargetType="{x:Type control:TextBoxExt}" 
     BasedOn="{StaticResource {x:Type TextBox}}" /> 
Cuestiones relacionadas