おそらく、一部の開発者は、コンバーターの使用時に、プレゼンテーション、そのデータコンテキスト、またはバインドが行われた視覚要素自体に関する情報がコンバーターパラメーターに転送されないという問題に直面しました。 一方で、それは良いことであり、ロジックの保護と分離を実現します。コンバーターの制御を直接操作するのはあまり適切ではありませんが、一方で、まれなケースでは、さまざまなトリックに行かなければならない制限のためです。
強力で効率的なデータバインディングメカニズムが開発されたという事実にもかかわらず、古き良きイベントモデルは依然としてその関連性を失っていません。 もちろん、プログレッシブ開発ツールを損なうためにイベントを使用するべきではありませんが、それらのアプリケーションが便利で自然であることが判明する場合があります。
両方の方法を組み合わせてみませんか? たとえば、このように
ICompositeConverter
using System.Windows.Data; namespace Aero.Converters.Patterns { public interface ICompositeConverter : IValueConverter { IValueConverter PostConverter { get; set; } object PostConverterParameter { get; set; } } }
IInlineConverter
using System; using System.Globalization; using System.Windows.Data; namespace Aero.Converters.Patterns { public class ConverterEventArgs : EventArgs { public object ConvertedValue { get; set; } public object Value { get; private set; } public Type TargetType { get; private set; } public object Parameter { get; private set; } public CultureInfo Culture { get; private set; } public ConverterEventArgs(object value, Type targetType, object parameter, CultureInfo culture) { TargetType = targetType; Parameter = parameter; Culture = culture; Value = value; } } public interface IInlineConverter : IValueConverter { event EventHandler<ConverterEventArgs> Converting; event EventHandler<ConverterEventArgs> ConvertingBack; } //public interface IInlineConverter : IValueConverter //{ // event Func<object, Type, object, CultureInfo, object> Converting; // event Func<object, Type, object, CultureInfo, object> ConvertingBack; //} }
インラインコンバーター
using System; using System.Globalization; using System.Windows.Data; using Aero.Converters.Patterns; namespace Aero.Converters { public class InlineConverter : IInlineConverter, ICompositeConverter { public IValueConverter PostConverter { get; set; } public object PostConverterParameter { get; set; } public event EventHandler<ConverterEventArgs> Converting; public event EventHandler<ConverterEventArgs> ConvertingBack; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var args = new ConverterEventArgs(value, targetType, parameter, culture); var handler = Converting; if (handler != null) handler(this, args); return PostConverter == null ? args.ConvertedValue : PostConverter.Convert(args.ConvertedValue, targetType, PostConverterParameter, culture); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { var args = new ConverterEventArgs(value, targetType, parameter, culture); var handler = ConvertingBack; if (handler != null) handler(this, args); return PostConverter == null ? args.ConvertedValue : PostConverter.ConvertBack(args.ConvertedValue, targetType, PostConverterParameter, culture); } } }
何が得られますか? コンバーターインスタンスをコントロールまたはプレゼンテーションリソースに埋め込み、ビューのBehindコード( Code Behind )で、 ConvertingおよびConvertingBackイベントに必要なハンドラーを作成する必要があります。視覚的なツリーとデータコンテキストで表示! 突然、私は多くの行動の自由を手に入れました。さらに、インターフェイスロジックがコンバーター自体に入らず、behinコードにのみ残っていたため、すべてがイデオロギー的に真実のままでした。
このアプローチを使用した簡単な例を次に示します
<Grid> <Grid.Resources> <InlineConverter x:Key="InlineConverter" Converting="InlineConverter_OnConverting"/> </Grid.Resources> <TextBlock Text="{Binding Number, Converter={StaticResource InlineConverter}}"/> </Grid>
private void InlineConverter_OnConverting(object sender, ConverterEventArgs e) { e.ConvertedValue = string.Format("Title: {0} \nDataContext:\n{1} \nConverter Value: {2}", Title, DataContext, e.Value); }
Composite Converter [ ICompositeConverter ]パターンをさらに使用すると、さまざまなコンバーターをチェーンに結合して、新しいクラスを作成することなくロジックを変更できます。
AeroフレームワークライブラリのHelloAeroデモプロジェクト[ バックアップリンク ]で、 Inline Converterおよび他のいくつかの動作を確認できます。
ご清聴ありがとうございました!
PS ダイナミックグリッドに関する前の記事
更新する
申込み
実際に提示された方法の必要性はまれにしか発生しませんが、同時に「不快な」状況での生活を非常に困難にする可能性があります。 たとえば、この方法では、コードをWPFからWindows Phoneに移植するときにMultiBindingを置き換えることができます。これは、モバイルプラットフォームでは複数のバインディングがサポートされていないためです。 組み込みのコンバーターを覚えておけば、適切なタイミングでそれらのアプリケーションを見つけることができます。