¿Cómo se establece un MarkupExtension
personalizado desde el código?Establecer CustomupExtension desde el código
Puede establecerlo fácilmente desde Xaml. Lo mismo ocurre con Binding
y DynamicResource
.
<TextBox FontSize="{Binding MyFontSize}"
Style="{DynamicResource MyStyle}"
Text="{markup:CustomMarkup}"/>
Ajuste de los mismos valores a través de código requiere detrás de un enfoque un poco diferente
Encuadernación: Uso textBox.SetBinding o BindingOperations.SetBinding
Binding binding = new Binding("MyFontSize"); BindingOperations.SetBinding(textBox, TextBox.FontSizeProperty, binding);
DynamicResource: Use SetResourceReference
textBox.SetResourceReference(TextBox.StyleProperty, "MyStyle");
CustomMarkup: ¿Cómo se configura una costumbre
MarkupExtension
de código? ¿Debo llamar aProvideValue
y ese caso, ¿cómo puedo obtener una bodega de unIServiceProvider
? *CustomMarkupExtension customExtension = new CustomMarkupExtension(); textBox.Text = customExtension.ProvideValue(??);
he encontrado sorprendentemente poco sobre el tema es así, ¿Se puede hacer?
H.B. ha respondido la pregunta. Solo agregué algunos detalles aquí sobre por qué quería hacer esto. Traté de crear una solución para el siguiente problema.
El problema es que no puede derivar de Binding
y anular ProvideValue
ya que está sellado. En su lugar, tendrá que hacer algo como esto: A base class for custom WPF binding markup extensions. Pero entonces el problema es que cuando devuelve un Binding
a un Setter
obtiene una excepción, pero fuera del Style
funciona bien.
que he leído en varios lugares que debe devolver el MarkupExtension
sí mismo si el TargetObject
es una Setter
para permitir que se reeavaluate una vez que se está aplicando a una real FrameworkElement
y esto tiene sentido.
- Markup Extension in Data Trigger
- Huge limitation of a MarkupExtension
- A base class for custom WPF binding markup extensions (en los comentarios)
Sin embargo, esto sólo funciona cuando el TargetProperty
es de tipo object
, de lo contrario la excepción está de vuelta. Si nos fijamos en el código fuente de BindingBase
, puede ver que hace exactamente esto, pero parece que el marco tiene algún ingrediente secreto que lo hace funcionar.
Hey H.B. Sí, lo leí también, sin embargo, esperaba que todavía hubiera una manera. Esta es una muy mala noticia y la costumbre de 'MarkupExtensions' parece un concepto de semi-trabajo. No pueden usarse en un 'Style'' Setter' si TargetProperty no es de tipo 'object', así que esperaba solucionar este problema aplicándolo yo mismo en un comportamiento adjunto, pero ahí va ese plan. De todos modos, gracias por su respuesta –
@Meleak: Bueno, como el nombre dice MarkupExtensions ampliar el marcado, en realidad no están destinados a ser utilizados en el código. Por cierto, no puedo reproducir ningún problema con el uso de MarkupExtensions en Setters. –
Estoy de acuerdo, esto está más que implícito en el nombre, solo esperaba una forma :) No estaba muy claro en mi comentario, el problema es cuando le das un valor 'Vinculante' a un 'Setter'. Has respondido la pregunta y acepto tu respuesta. Agregué algunos detalles de por qué quería hacer esto en mi pregunta –