首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用WPF从bindingexpression中解析绑定对象?

如何用WPF从bindingexpression中解析绑定对象?
EN

Stack Overflow用户
提问于 2009-10-11 03:37:52
回答 3查看 17.2K关注 0票数 26

大家好,有没有人知道有没有内置的类来解析绑定表达式中的绑定对象,以及它的DataItem和属性路径?

我正在尝试为textbox编写Blend 3行为,它会自动调用绑定到textbox Text属性的对象上的方法。

textbox绑定到viewmodel类上的属性。我想要做的是解析绑定表达式中的viewmodel类,然后调用它。

我首先从行为的相关对象中检索绑定表达式,如下所示:

代码语言:javascript
复制
private BindingExpression GetTextBinding()
{
    return this.AssociatedObject.GetBindingExpression(TextBox.TextProperty);
}

完成此操作后,如果我们查看绑定表达式,我们可以看到它通过绑定表达式的DataItem属性引用了数据上下文。

此外,我们还有绑定到绑定表达式的父绑定上的属性的相对路径。

因此,我们可以获得以下信息:

代码语言:javascript
复制
var bindingExpression = GetTextBinding();
object dataContextItem = bindingExpression.DataItem;
PropertyPath relativePropertyPath = bindingExpression.ParentBinding.Path;

现在,这个属性路径可能是一个深度嵌套的复杂路径,我非常希望避免不得不(重新?)实现解析。我已经搜索了.NET文档,并使用反射器跳过了所有的程序集,但都无济于事-我找不到肯定存在的东西-一定有一些类执行数据项(数据上下文)的路径解析。

有没有人知道它可能存在的地方?对于解决绑定对象的替代方法,有什么建议吗?

注意,我正在尝试获取绑定对象,它是绑定属性的父对象(在本例中是string )-显然我可以很容易地获取绑定值,但它是我需要的父对象。

提前感谢您的帮助!菲尔

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-18 04:26:35

下面是一个扩展方法的快速实现,它将完成您正在寻找的功能。我也找不到任何与此相关的东西。如果由于某种原因找不到值,下面的方法将始终返回null。当路径包含[]时,该方法将不起作用。我希望这能帮到你!

代码语言:javascript
复制
public static T GetValue<T>(this BindingExpression expression, object dataItem)            
{
    if (expression == null || dataItem == null)
    {
        return default(T);
    }

    string bindingPath = expression.ParentBinding.Path.Path;
    string[] properties = bindingPath.Split('.');

    object currentObject = dataItem;
    Type currentType = null;

    for (int i = 0; i < properties.Length; i++)
    {
        currentType = currentObject.GetType();                
        PropertyInfo property = currentType.GetProperty(properties[i]);
        if (property == null)
        {                    
            currentObject = null;
            break;
        }
        currentObject = property.GetValue(currentObject, null);
        if (currentObject == null)
        {
            break;
        }
    }

    return (T)currentObject;
}
票数 25
EN

Stack Overflow用户

发布于 2009-12-30 05:29:12

为了进一步了解,PropertyPath解析是由一个名为PropertyPathWorker的内部MS类处理的,该类位于PresentationFramework中的MS.Internal.Data下。如果你在Reflector中打开它,你会发现它相当复杂,所以我不建议尝试复制它的功能。它与整个绑定架构紧密耦合。

支持所有属性路径语法(包括附加的依赖属性和分层遍历)的最健壮的方法可能是创建一个带有DependencyProperty的虚拟DependencyObject。然后,您可以创建一个从“所有者”路径到虚拟依赖属性的绑定,创建一个新的BindingExpression,然后调用表达式的UpdateTarget。这是一种相当繁重的方式来完成表面上看起来很简单的任务,但我认为在为绑定解析属性路径的方式中有很多隐藏的陷阱。

票数 11
EN

Stack Overflow用户

发布于 2011-08-12 22:31:12

我相信另一个StackOverflow solution posted here可能也适用于您。

复制代码块作为参考,阅读由Thomas Levesque提供的更多细节的原始帖子。

代码语言:javascript
复制
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));
    }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1549785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档