Расширения разметки в WPF / Silverlight - PullRequest
7 голосов
/ 04 марта 2009

Кто-нибудь когда-нибудь создавал собственное расширение разметки в WPF или Silverlight? Когда бы вы хотели или должны это сделать? Любые советы или источники о том, как это сделать?

Ответы [ 4 ]

9 голосов
/ 04 марта 2009

Примером может служить Локализация :

Простой и эффективный способ локализации ресурсов приложения - это написать пользовательское расширение MarkupExtension, которое предоставляет локализованное значение . расширение принимает параметр, который является уникальным ключ ресурса ... [и затем] ищет значение от универсального поставщика ресурсов.

Примечание: Вы не можете писать собственные расширения разметки в silverlight.

4 голосов
/ 04 марта 2009

Да, это удобно, и я создал его сам. Я создал расширение разметки под названием EvalBinding , которое принимает набор привязок в качестве дочерних элементов и строку оценки C #. Он обрабатывает C # для обработки значений из дочерних привязок, поэтому мне не нужно создавать много простых TypeConverter классов.

Например, я могу сделать это ...

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

Где это является ссылкой на массив результатов дочернего связывания.

Для ресурсов по реализации MarkupExtension ...

* 1017 MSDN *

Запись в блоге Джоша Смита

Запись в блоге Роба Рельея

1 голос
/ 11 мая 2011

Hooray !!

Это реализовано в Silverlight 5 !!

И, кроме того, теперь это общий интерфейс вместо класса !!

Проверить .

Прочитайте это для примера.

0 голосов
/ 18 марта 2013

Я использую расширение разметки для стандартизации моих привязок проверки. Так что выгода здесь невелика, 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; }
    }
}
...