如果我有一个名为MyObject的对象,它有一个名为MyChild的属性,它本身有一个名为Name的属性。如果我拥有的只是一个绑定路径(即“MyChild.Name”),并且对MyObject的引用,我该如何获取该Name属性的值?
MyObject
-MyChild
-Name
答案 0 :(得分: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));
}
}
答案 1 :(得分:3)
我开发了nuget package 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]"
答案 2 :(得分:0)
不确定你想做什么,但是如何(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>
答案 3 :(得分:0)
我这样做。如果这是一个可怕的想法,请告诉我,因为C#对我来说只是一个副作用所以我不是专家对象ToAddTo属于ItemsControl类型:
.supporting div:nth-of-type(1) {
display: none;
}