有没有人在WPF或Silverlight中创建自定义标记扩展?你什么时候想要或者需要这样做?关于如何做的任何提示或来源?
答案 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的资源......
答案 2 :(得分:1)
答案 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; }
}
}