WPF / Silverlight中的标记扩展

时间:2009-03-04 01:16:54

标签: wpf silverlight markup-extensions

有没有人在WPF或Silverlight中创建自定义标记扩展?你什么时候想要或者需要这样做?关于如何做的任何提示或来源?

4 个答案:

答案 0 :(得分:9)

一个例子是Localization

  

本地化应用程序资源的一种简单有效的方法是   编写提供本地化值的自定义MarkupExtension 。该   extension接受一个唯一的参数   资源键... [然后]从通用资源提供程序中查找值。

注意:您无法在silverlight中编写自定义标记扩展名。

答案 1 :(得分:4)

是的,它很方便,我自己创造了一个。我创建了一个名为 EvalBinding 的标记扩展,它将一组绑定作为子项和一个C#计算字符串。它评估C#以处理子绑定中的值,这样我就不需要创建许多简单的 TypeConverter 类。

例如,我可以这样做......

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

其中是对子绑定结果数组的引用。

有关实施MarkupExtension的资源......

MSDN

Josh Smith Blog Entry

Rob Relyea Blog Entry

答案 2 :(得分:1)

万岁!!

这是在Silverlight 5中实现的!!

而且,现在它是一个通用的界面,而不是一个类!!

Check it out

阅读this以获取示例。

答案 3 :(得分:0)

我使用标记扩展来标准化我的验证绑定。所以这里的好处很小,我不需要再设置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; }
    }
}