如果我有一个名为 MyObject 的对象,它有一个名为 MyChild 的属性,它本身有一个名为 Name 的属性。如果我只有一个绑定路径(即“MyChild.Name”)和对 MyObject 的引用,我如何获得该 Name 属性的值?
MyObject
-MyChild
-Name
如果我有一个名为 MyObject 的对象,它有一个名为 MyChild 的属性,它本身有一个名为 Name 的属性。如果我只有一个绑定路径(即“MyChild.Name”)和对 MyObject 的引用,我如何获得该 Name 属性的值?
MyObject
-MyChild
-Name
我找到了一种方法来做到这一点,但它非常难看,可能不是很快......基本上,这个想法是创建一个具有给定路径的绑定并将其应用于依赖对象的属性。这样,绑定完成了检索值的所有工作:
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));
}
}
我开发了一个nuget 包 Pather.CSharp 可以满足您的需要。
它包含一个类Resolver
,该类Resolve
的行为类似于@ThomasLevesque 的GetValue
方法。
例子:
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]"
不知道你想做什么,但如何(xaml 或代码)但你总是可以命名你的对象
<MyObject x:Name="myBindingObject" ... />
然后在代码中使用它
myBindingObject.Something.Name
或在 xaml
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="myBindingObject"
Storyboard.TargetProperty="Background"
To="AA2343434" Duration="0:0:2" >
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
我正在这样做。如果这是一个糟糕的主意,请告诉我,因为 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