7

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

4

4 回答 4

9

一个例子是本地化

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

注意:您不能在 silverlight 中编写自定义标记扩展。

于 2009-03-04T08:58:50.490 回答
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

乔什·史密斯博客条目

Rob Relyea 博客条目

于 2009-03-04T01:37:56.587 回答
1

Hooray!!

This is implemented in Silverlight 5!!

And furthermore, now it's a generic interface instead of a class!!

Check it out.

Read this for an example.

于 2011-05-10T21:57:53.280 回答
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; }
    }
}
于 2013-03-18T10:11:04.397 回答