【问题标题】:Find all view - viewmodel bindings查找所有视图 - 视图模型绑定
【发布时间】:2018-01-29 11:57:44
【问题描述】:

目前我找到 XAML 视图绑定的方式是单击 XAML 诊断工具(屏幕顶部的小黑条)-> 选择控件-> 在代码中查看它的属性-> 查看“DataContext”属性。

通过这种方式,您可以找到哪个视图模型绑定到哪个视图,但这是一个非常缓慢的过程。

我正在寻找一种方法来查找所有当前绑定的视图 - 视图模型对。这显然只在运行时有效,但这很好。 一段代码、一个 nuget 扩展或任何可以给我绑定列表的东西。 谢谢!

【问题讨论】:

    标签: xaml mvvm view binding viewmodel


    【解决方案1】:

    我认为反思可以让你走得更远。

    使用此方法迭代输出目录中的文件。并找到所有程序集

    Directory.GetFiles()
    

    https://msdn.microsoft.com/en-us/library/07wt70x2.aspx

    然后加载程序集并查找正确的类。

    Assembly SampleAssembly;
    SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
    

    https://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes.aspx

    使用 TypeDescriptor 获取更详细的信息

    ICustomTypeDescriptor typeDescriptor = dataContext as ICustomTypeDescriptor;
    

    https://msdn.microsoft.com/en-us/library/system.componentmodel.typedescriptor.aspx

    并找出底层类型。

    这可能是我脑海中的步骤。 由于 powershell 也可以访问 dotnet 类,因此它可以是输出所需信息的脚本,也可以在 VisualStudio 中执行。

    但是...您还可以引入一些约定。我见过的大多数项目都有相同的命名模式。 CustomerView -> CustomerViewModel。这也适用于组件OrderTableRowView -> OrderTableRowViewModel。有了这个,您将始终知道哪个ViewModel 属于哪个视图(或视图的一部分)。

    顺便说一句:如果您有如此复杂的结构以及如此多的ViewsViewModels,那么可能是时候考虑将视图和视图模型配对的服务之类的东西了。有时称为ViewModelLocatorService。这使 View 和 ViewModel 之间的结合保持集中。

    HTH ;)

    【讨论】:

    • 感谢您的帮助,好先生,我将有机会在星期一看到这个,但它看起来确实是我可以使用的东西! :)
    • 您好!我发现了一种更简单的方法,尽管它仍然不是 100% 的解决方案。 foreach (Window window in Application.Current.Windows) { System.Console.WriteLine(window.GetType() + "=>" + window.DataContext); }; ...完成了这项工作,但是它没有获取每个窗口的子元素。我目前正在视图中搜索那些(内容 - 孩子?)。这需要在调试时完成。我发现我还可以使用 WPF 可视化工具(单击放大镜)来查找单个数据上下文。
    • 但是 WPF 可视化工具与 Live Visual Tree 大致相同,因此它是“狙击枪”解决方案,而不是“霰弹枪”。
    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2013-01-03
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多