¿Cómo puedo escribir una plantilla como esta?Aplicar UpdateSourceTrigger = PropertyChanged a todos los cuadros de texto wpf
<DataTemplate ... TextBlock>
UpdateSourceTrigger=PropertyChanged
</DataTemplate>
¿Cómo puedo escribir una plantilla como esta?Aplicar UpdateSourceTrigger = PropertyChanged a todos los cuadros de texto wpf
<DataTemplate ... TextBlock>
UpdateSourceTrigger=PropertyChanged
</DataTemplate>
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).
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}}" />
he actualizado la respuesta. – devdigital
¿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
¡Gracias por la respuesta! – syned