17

およびを実装する任意の2つのCLRプロパティ間のバインディングを可能にするデータバインディングフレームワーク(BCLまたはその他)はありますか?次のようなことができるはずです。INotifyPropertyChangedINotifyCollectionChanged

var binding = new Binding();
binding.Source = someSourceObject;
binding.SourcePath = "Customer.Name";
binding.Target = someTargetObject;
binding.TargetPath = "Client.Name";
BindingManager.Bind(binding);

を実装するPOCOはどこsomeSourceObjectにありますか。ただし、これに対するBCLのサポートについては知りません。また、これを許可する既存のフレームワークがあるかどうかもわかりません。someTargetObjectINotifyPropertyChanged

更新:利用可能な既存のライブラリがないことを考えると、私は自分でそれを作成することにしました。こちらから入手できます。

ありがとう

4

6 に答える 6

11

その空白を埋めるためにTrussを書きました。

于 2009-06-11T12:16:02.033 に答える
8

これを行うライブラリは知りませんが、独自のライブラリをかなり簡単に作成できます。

以下は、2 つの単純なプロパティ間で双方向のデータ バインディングを確立するために、私が数分で作成した基礎です。

public static class Binder
{

    public static void Bind(
        INotifyPropertyChanged source,
        string sourcePropertyName,
        INotifyPropertyChanged target,
        string targetPropertyName)
    {
        var sourceProperty
            = source.GetType().GetProperty(sourcePropertyName);
        var targetProperty
            = target.GetType().GetProperty(targetPropertyName);

        source.PropertyChanged +=
            (s, a) =>
            {
                var sourceValue = sourceProperty.GetValue(source, null);
                var targetValue = targetProperty.GetValue(target, null);
                if (!Object.Equals(sourceValue, targetValue))
                {
                    targetProperty.SetValue(target, sourceValue, null);
                }
            };

        target.PropertyChanged +=
            (s, a) =>
            {
                var sourceValue = sourceProperty.GetValue(source, null);
                var targetValue = targetProperty.GetValue(target, null);
                if (!Object.Equals(sourceValue, targetValue))
                {
                    sourceProperty.SetValue(source, targetValue, null);
                }
            };
    }
}

もちろん、このコードにはいくつかの優れた点が欠けています。追加するものは次のとおりです

  • sourcetargetが割り当てられていることを確認する
  • sourcePropertyNameおよび で識別されるプロパティtargetPropertyNameが存在することを確認する
  • 2 つのプロパティ間の型の互換性を確認する

また、リフレクションは比較的遅いため (ただし、破棄する前にベンチマークを行いますが、それほど遅くはありません)、代わりにコンパイル済みの式を使用することをお勧めします。

最後に、プロパティを文字列で指定するとエラーが発生しやすいため、代わりに Linq 式と拡張メソッドを使用できます。次に、書く代わりに

Binder.Bind( source, "Name", target, "Name")

あなたが書くことができます

source.Bind( Name => target.Name);
于 2009-03-10T06:35:59.847 に答える
1

AutoMapperは 2 つのインスタンス間で値をコピーできますが、これを自動的に行うには独自のコードを記述する必要があります。

于 2009-03-06T00:42:00.480 に答える
1

バインド可能なLINQまたは継続的な linqがここで役立つかもしれません。実際の更新データの "派生プロパティ" であるモデル プロパティを追加して、UI のバインドを容易にする場合は、これら 2 つのフレームワークが役立ちます。

于 2009-03-06T10:16:00.273 に答える
-2

プロパティをDependencyPropertyとして定義した場合は、それを行うことができます。WF と WPF の両方に実装があるため (最初のリンクは WPF 用です。WF の場合はこれです)、どちらを使用するかを決定する必要がありますが、どちらも必要に応じて十分です。

于 2009-03-11T11:35:47.777 に答える