【问题标题】:WPF - Getting a property value from a binding pathWPF - 从绑定路径获取属性值
【发布时间】:2011-04-04 09:59:58
【问题描述】:

如果我有一个名为 MyObject 的对象,它有一个名为 MyChild 的属性,它本身有一个名为 Name 的属性。如果我只有一个绑定路径(即“MyChild.Name”)和对 MyObject 的引用,我如何获取该 Name 属性的值?

MyObject
  -MyChild
    -Name

【问题讨论】:

  • 你能提供一个你想如何使用它的例子吗?

标签: wpf binding markup-extensions


【解决方案1】:

不确定您想要做什么,但不确定如何(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>

【讨论】:

    【解决方案2】:

    我找到了一种方法来做到这一点,但它非常难看而且可能不是很快......基本上,这个想法是创建一个具有给定路径的绑定并将其应用于依赖对象的属性。这样,绑定就完成了检索值的所有工作:

    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 和干杯。
    • 太好了,谢谢托马斯!我需要这样的东西的原因是因为我已经编写了一个自定义标记扩展来加载图像。此扩展具有图像名称的 Name 属性,我现在想将其绑定到使用标记扩展的 DataTemplate 中的模型属性。但是,我无法绑定,因为 Name 不是 DP,也不能是 :( 这是我能想到的唯一解决方案,所以我会试试这个代码。谢谢。
    • 这非常适合我的需要(在给定绑定路径的情况下获取和设置视图模型的属性值)。是否有类似的方法来获取将与给定绑定路径绑定的属性的 type
    • @Wayne,我不知道。您可以使用上面的技巧获取值,然后对其调用 GetType,但当然如果值为 null 它不起作用...
    • 对,问题出在空值上。在那种情况下,我仍然需要这种类型。至于反射,考虑到绑定路径不仅可以使用点表示法来进行属性访问(例如,[] 用于索引到列表和字典中),那么这种逻辑可能很复杂。我希望 BindingOperations 等还有其他一些隐藏的功能。人。那会为我做的。谢谢。
    【解决方案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]"
    

    【讨论】:

    • 是否支持访问显式实现的接口属性和隐藏属性?
    • @Grx70 是的。它通过反射工作,因此如果该属性存在于对象上并且是公共的,它将获得它的值。
    【解决方案4】:

    我就是这样做的。如果这是一个糟糕的主意,请告诉我,因为 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
    

    【讨论】:

    • 如果绑定路径是一个简单的属性名称,这可以工作。如果路径类似于“Dictonary[key]”或“Owner.Member”,则它不起作用。
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2013-03-22
    • 2012-11-11
    相关资源
    最近更新 更多