【问题标题】:XAML Named element not found by FindNameFindName 未找到 XAML 命名元素
【发布时间】:2011-09-18 14:30:09
【问题描述】:

在我的代码隐藏文件中查找在 XAML 中声明的命名对象时遇到问题。

我想从我的视图中初始化一个视图模型。但是,我还需要在我的代码隐藏文件中引用 ViewModel(主要用于导航支持、处理事件等,而我无法从我的 ViewModel 轻松完成)

<navigation:Page.DataContext>
    <vm:JobsViewModel x:Name="ViewModel" />
</navigation:Page.DataContext>

但是,当我尝试在后面的代码中访问 ViewModel 时出现空引用异常:

    Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)
        MyBase.OnNavigatedTo(e)
        ViewModel.Initalize() '<-- Exception here
    End Sub

更多研究表明,FindName 调用 InitalizeComponent 中的“ViewModel”返回 null。我尝试阅读 XAML 名称范围等,但据我所知,这应该是一个简单的案例并且可以正常工作,不是吗?

任何关于为什么失败的指针将不胜感激。谢谢!

【问题讨论】:

    标签: wpf vb.net silverlight xaml findname


    【解决方案1】:

    那是因为您的 JobsViewModel 不是可视化树的一部分,所以 FindName 找不到它。您可以改为通过 DataContext 属性检索它。

    【讨论】:

    • 据我了解 FindName 的文档,它搜索 XAML 树,这不一定与可视树相同。而且我认为我看到了使用 x:Name 的示例,例如一个 Brush 属性,然后使用 Binding.ElementName 引用它,我认为它的工作原理类似于 FindName...
    • 是的,DataContext 可以工作,但我有兴趣了解 x:Name、FindName(, ElementName) 如何协同工作以供将来参考并避免更多错误。
    • @aKzenT,看看this article,这是我见过的最好的主题
    • 谢谢,它很好地解释了 WPF 中逻辑树和可视树之间的区别。但是在 MSDN 中,它说 FindName 在 XAML Namescope 上工作,应该独立于此。另外,当我将 Page 的 Background 属性设置为 SolidColorBrush 并给这个画笔起一个名字时,它将显示在 FindName 中,那么区别在哪里?为什么它不适用于 DataContext?
    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 2021-12-20
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多