gpt4 book ai didi

wpf - 从 WPF 窗口中检索所有数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 16:21:38 24 4
gpt4 key购买 nike

我有一个 WPF 表单,上面有很多控件。这些控件中的许多(但不是全部)数据绑定(bind)到底层对象。在某些时候,例如当按下 Save 按钮时,我需要检查我的控件的所有验证规则。有没有办法以编程方式执行此操作,没有 硬编码要验证的控件列表?我希望在另一个开发人员添加另一个控件和另一个绑定(bind)之后继续工作,而不必更新一些要刷新的绑定(bind)列表。

简而言之,有没有办法从 WPF 窗口中检索所有数据绑定(bind)的集合?

最佳答案

在下面试试我的示例。我还没有完全测试这个,所以它可能有问题。此外,性能可能值得怀疑。也许其他人可以帮助加快速度。但无论如何,它似乎可以解决问题。

注意:但是,对此的一个限制是它可能无法获取 Styles 或 DataTemplates 中定义的绑定(bind)。不过我不确定。需要更多的测试。

无论如何,解决方案基本上分为三个部分:

  • 使用 VisualTreeHelper 遍历整个可视化树。
  • 对于可视树中的每个项目,获取所有依赖项属性。 Reference .
  • 使用 BindingOperations.GetBindingBase 获取每个属性的绑定(bind)。

  • GetBindingsRecursive 功能:
    void GetBindingsRecursive(DependencyObject dObj, List<BindingBase> bindingList)
    {
    bindingList.AddRange(DependencyObjectHelper.GetBindingObjects(dObj));

    int childrenCount = VisualTreeHelper.GetChildrenCount(dObj);
    if (childrenCount > 0)
    {
    for (int i = 0; i < childrenCount; i++)
    {
    DependencyObject child = VisualTreeHelper.GetChild(dObj, i);
    GetBindingsRecursive(child, bindingList);
    }
    }
    }

    依赖对象助手 类(class):
    public static class DependencyObjectHelper
    {
    public static List<BindingBase> GetBindingObjects(Object element)
    {
    List<BindingBase> bindings = new List<BindingBase>();
    List<DependencyProperty> dpList = new List<DependencyProperty>();
    dpList.AddRange(GetDependencyProperties(element));
    dpList.AddRange(GetAttachedProperties(element));

    foreach (DependencyProperty dp in dpList)
    {
    BindingBase b = BindingOperations.GetBindingBase(element as DependencyObject, dp);
    if (b != null)
    {
    bindings.Add(b);
    }
    }

    return bindings;
    }

    public static List<DependencyProperty> GetDependencyProperties(Object element)
    {
    List<DependencyProperty> properties = new List<DependencyProperty>();
    MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element);
    if (markupObject != null)
    {
    foreach (MarkupProperty mp in markupObject.Properties)
    {
    if (mp.DependencyProperty != null)
    {
    properties.Add(mp.DependencyProperty);
    }
    }
    }

    return properties;
    }

    public static List<DependencyProperty> GetAttachedProperties(Object element)
    {
    List<DependencyProperty> attachedProperties = new List<DependencyProperty>();
    MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element);
    if (markupObject != null)
    {
    foreach (MarkupProperty mp in markupObject.Properties)
    {
    if (mp.IsAttached)
    {
    attachedProperties.Add(mp.DependencyProperty);
    }
    }
    }

    return attachedProperties;
    }
    }

    示例用法:
    List<BindingBase> bindingList = new List<BindingBase>();
    GetBindingsRecursive(this, bindingList);

    foreach (BindingBase b in bindingList)
    {
    Console.WriteLine(b.ToString());
    }

    关于wpf - 从 WPF 窗口中检索所有数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3586870/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com