13


4

WPF-バインディングパスからプロパティ値を取得する

MyObjectという名前のオブジェクトがあり、MyChildという名前のプロパティがあり、MyChild自体にはNameという名前のプロパティがあります。 バインディングパス(つまり、 「MyChild.Name」)、およびMyObjectへの参照?

MyObject
  -MyChild
    -Name

4 Answer


20


私はこれを行う方法を見つけましたが、それは非常にく、おそらく非常に高速ではありません…​ 基本的に、アイデアは、指定されたパスでバインディングを作成し、依存関係オブジェクトのプロパティに適用することです。 そのようにして、バインディングは値を取得するすべての作業を実行します。

public static class PropertyPathHelper
{
    public static object GetValue(object obj, string propertyPath)
    {
        Binding binding = new Binding(propertyPath);
        binding.Mode = BindingMode.OneTime;
        binding.Source = obj;
        BindingOperations.SetBinding(_dummy, Dummy.ValueProperty, binding);
        return _dummy.GetValue(Dummy.ValueProperty);
    }

    private static readonly Dummy _dummy = new Dummy();

    private class Dummy : DependencyObject
    {
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(object), typeof(Dummy), new UIPropertyMetadata(null));
    }
}


3


私はhttps://www.nuget.org/packages/Pather.CSharp[nuget package] Pather.CSharpを開発しました。これはまさに必要なことを行います。

@ThomasLevesqueの GetValue`メソッドのように振る舞う Resolve`メソッドを持つクラス `Resolver`が含まれています。 例:

IResolver resolver = new Resolver();
var o = new { Property1 = Property2 = "value" } };
var path = "Property1.Property2";
object result = r.Resolve(o, path); //the result is the string "value"

インデックスを介した*コレクションアクセス*またはキーを介した*辞書アクセス*もサポートしています。 これらのパスの例は次のとおりです。

"ArrayProperty[5]"
"DictionaryProperty[Key]"


0


あなたが何をしたいのかわからないが、どのように(xamlまたはコード)まだあなたのオブジェクトにいつでも名前を付けることができます


その後、コードで使用します

myBindingObject.Something.Name

またはxamlで



0


私はこうやっています。 これがひどいアイデアであるかどうかを教えてください、C#は私にとって単なる副業なので、私は専門家ではありませんobjectToAddToはItemsControl型です:

BindingExpression itemsSourceExpression = GetaBindingExression(objectToAddTo);
object itemsSourceObject = (object)itemsSourceExpression.ResolvedSource;
string itemSourceProperty = itemsSourceExpression.ResolvedSourcePropertyName;

object propertyValue = itemsSourceObject.GetType().GetProperty(itemSourceProperty).GetGetMethod().Invoke(itemsSourceObject, null); // Get the value of the property