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

Josh Smith ブログエントリ

Rob Relyea ブログエントリ

于 2009-03-04T01:37:56.587 に答える
1

万歳!!

これはSilverlight 5で実装されました!!

さらに、クラスではなく汎用インターフェースになりました!!

それをチェックしてください

例としてこれを読んでください。

于 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 に答える