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
Odpowiedz
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 ...
Innym przykładem może być dla Localization
Uwaga: Nie można napisać niestandardowy znaczników rozszerzenia w silverlight.
Ah, inny w to wiele ograniczeń. Nie mogę się doczekać Mix, więc mogę się dowiedzieć, czy naprawili to gówno. –
Gorzkie łzy frustracji. – cplotts
Hooray !!
Zaimplementowano to w Silverlight 5 !!
Co więcej, teraz jest to ogólny interfejs zamiast klasy!
Przeczytaj this dla przykładu.
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; }
}
}
mówisz WPF lub Silverlight, to cholernie dużo innego, szczególnie w tym aspekcie ... – Shimmy