WPF または Silverlight でカスタム マークアップ拡張機能を作成したことのある人はいますか? いつこれをしたい、またはする必要がありますか? それを行う方法に関するヒントやソースはありますか?
2263 次
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 の実装に関するリソースについては...
于 2009-03-04T01:37:56.587 に答える
1
于 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 に答える