2009-03-04 26 views
6

¿Alguna vez alguien ha creado una extensión de marcado personalizado en WPF o Silverlight? ¿Cuándo querrías o necesitarías hacer esto alguna vez? ¿Algún consejo o fuente sobre cómo hacerlo?Extensiones de marcado en WPF/Silverlight

+0

¿Estás hablando de WPF o Silverlight, que es muchísimo diferente, especialmente en este aspecto ... – Shimmy

Respuesta

4

Sí, es útil y yo mismo he creado uno. Creé una extensión de marcado llamada EvalBinding que toma un conjunto de enlaces como secundarios y una cadena de evaluación C#. Evalúa C# para procesar los valores de los enlaces secundarios para que no necesite crear muchas clases simples TypeConverter.

Por ejemplo, yo puedo hacer esto ...

<EvalBinding Eval="(this[0] > this[1] ? 'GT' : 'LTE')"> 
    <Binding ElementName="element1" Path="Size"/> 
    <Binding ElementName="element2" Path="Size"/> 
<EvalBinding> 

Donde esta es una referencia a la matriz de resultados de unión niño.

por los recursos en la implementación de un MarkupExtension ...

MSDN

Josh Smith Blog Entry

Rob Relyea Blog Entry

9

Otro ejemplo sería que Localization

Nota: No se puede escribir de marcado personalizada extensiones en Silverlight.

+0

Ah, otra de sus muchas limitaciones. No puedo esperar a Mix para poder averiguar si arreglaron esta mierda. –

+0

Lágrimas amargas de frustración. – cplotts

2

¡Hurra!

Esto se implementa en Silverlight 5 !!

¡Y además, ahora es una interfaz genérica en lugar de una clase!

Check it out.

Lea this para ver un ejemplo.

0

Sé que esta es una publicación antigua, pero utilizo una extensión de marcado para estandarizar mis enlaces de validación. Así que el beneficio aquí es pequeño, 4 de los valores predeterminados que ya no tengo que establecer, y si deseo cambiarlos en el futuro, solo lo hago aquí.

using System; 
using System.Windows.Data; 
using System.Windows.Markup; 

namespace ITIS 
{ 
    /// <summary> 
    /// Creates a normal Binding but defaults NotifyOnValidationError to True, 
    /// ValidatesOnExceptions to True, Mode to TwoWay and 
    /// UpdateSourceTrigger to LostFocus. 
    /// </summary> 
    public sealed class ValidatedBinding : MarkupExtension 
    { 
     public ValidatedBinding(string path) 
     { 
      Mode = BindingMode.TwoWay; 

      UpdateSourceTrigger = UpdateSourceTrigger.LostFocus; 

      Path = path; 
     } 

     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
      return new Binding(Path) { 
       Converter = this.Converter, 
       ConverterParameter = this.ConverterParameter, 
       ElementName = this.ElementName, 
       FallbackValue = this.FallbackValue, 
       Mode = this.Mode, 
       NotifyOnValidationError = true, 
       StringFormat = this.StringFormat, 
       ValidatesOnExceptions = true, 
       UpdateSourceTrigger = this.UpdateSourceTrigger 
      }; 
     } 

     public IValueConverter Converter { get; set; } 

     public object ConverterParameter { get; set; } 

     public string ElementName { get; set; } 

     public object FallbackValue { get; set; } 

     public BindingMode Mode { get; set; } 

     public string Path { get; set; } 

     public string StringFormat { get; set; } 

     public UpdateSourceTrigger UpdateSourceTrigger { get; set; } 
    } 
}