Кто-нибудь когда-нибудь создавал собственное расширение разметки в WPF или Silverlight? Когда бы вы хотели или нуждались в этом? Любые советы или источники о том, как это сделать?
Расширения разметки в WPF/Silverlight
- Вы говорите о WPF или Silverlight, это чертовски сильно отличается, особенно в этом аспекте... 11.05.2011
Ответы:
Примером может служить Локализация:
Простой и эффективный способ локализации ресурсов приложения — написать пользовательское расширение MarkupExtension, которое предоставляет локализованное значение. Расширение принимает параметр, который является уникальным ключом ресурса... [а затем] ищет значение у универсального поставщика ресурсов.
Примечание. В Silverlight нельзя создавать собственные расширения разметки.
Да, это удобно, и я создал его сам. Я создал расширение разметки под названием EvalBinding, которое принимает набор привязок в качестве дочерних элементов и строку оценки C#. Он оценивает C# для обработки значений дочерних привязок, поэтому мне не нужно создавать множество простых классов TypeConverter.
Например, я могу сделать это...
<EvalBinding Eval="(this[0] > this[1] ? 'GT' : 'LTE')">
<Binding ElementName="element1" Path="Size"/>
<Binding ElementName="element2" Path="Size"/>
<EvalBinding>
Где this — ссылка на массив результатов дочерней привязки.
Ресурсы по реализации MarkupExtension...
Ура!!
Это реализовано в Silverlight 5!!
Более того, теперь это общий интерфейс вместо класса!!
Прочитайте это для примера.
Я использую расширение разметки для стандартизации привязок проверки. Так что тут польза небольшая, 4 значения по умолчанию мне больше не нужно ставить, и если я захочу изменить их в будущем, то сделаю это только здесь.
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; }
}
}