2009-03-04 20 views
6

Czy ktoś kiedykolwiek utworzył niestandardowe rozszerzenie znaczników w WPF lub Silverlight? Kiedy chciałbyś/chciałabyś to zrobić? Wszelkie wskazówki lub źródła, jak to zrobić?Rozszerzenia znaczników w WPF/Silverlight

+0

mówisz WPF lub Silverlight, to cholernie dużo innego, szczególnie w tym aspekcie ... – Shimmy

Odpowiedz

4

Tak, jest przydatny i sam go stworzyłem. Utworzono rozszerzenie znaczników o nazwie EvalBinding, które przyjmuje zestaw powiązań jako elementy podrzędne i ciąg oceny C#. Oblicza C#, aby przetworzyć wartości z powiązań potomnych, aby nie tworzyć wielu prostych klas TypeConverter.

Na przykład mogę to zrobić ...

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

Gdzie to jest odwołaniem do tablicy wiązania dzieci rezultatów.

Dla środków na wdrożenie MarkupExtension ...

MSDN

Josh Smith Blog Entry

Rob Relyea Blog Entry

9

Innym przykładem może być dla Localization

Uwaga: Nie można napisać niestandardowy znaczników rozszerzenia w silverlight.

+0

Ah, inny w to wiele ograniczeń. Nie mogę się doczekać Mix, więc mogę się dowiedzieć, czy naprawili to gówno. –

+0

Gorzkie łzy frustracji. – cplotts

2

Hooray !!

Zaimplementowano to w Silverlight 5 !!

Co więcej, teraz jest to ogólny interfejs zamiast klasy!

Check it out.

Przeczytaj this dla przykładu.

0

Wiem, że jest to bardzo staroświecki post, ale używam rozszerzenia znaczników do standaryzacji moich powiązań sprawdzania poprawności. Tak więc korzyści tutaj są niewielkie, 4 z domyślnych ustawień, których nie muszę już ustawiać, i jeśli chcę je zmienić w przyszłości, robię to tylko tutaj.

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; } 
    } 
}