Wpf FindName找不到XAML命名元素

Wpf FindName找不到XAML命名元素,wpf,vb.net,silverlight,xaml,findname,Wpf,Vb.net,Silverlight,Xaml,Findname,在代码隐藏文件中查找XAML中声明的命名对象时遇到问题 我想从视图内部初始化ViewModel。但是,我还需要在我的代码隐藏文件中引用ViewModel(基本上用于导航支持、处理事件等,这在我的ViewModel中是不容易做到的) 但是,当我尝试在代码隐藏中访问ViewModel时,会出现空引用异常: Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventAr

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

我想从视图内部初始化ViewModel。但是,我还需要在我的代码隐藏文件中引用ViewModel(基本上用于导航支持、处理事件等,这在我的ViewModel中是不容易做到的)


但是,当我尝试在代码隐藏中访问ViewModel时,会出现空引用异常:

    Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)
        MyBase.OnNavigatedTo(e)
        ViewModel.Initalize() '<-- Exception here
    End Sub
navigatedTo上的受保护覆盖子项(ByVal e As System.Windows.Navigation.NavigationEventArgs)
MyBase.OnNavigatedTo(e)

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

据我从FindName了解的文档,它搜索的是XAML树,它不一定与可视化树相同。我想我看到了一些示例,例如在一个笔刷属性上使用x:Name,然后使用Binding.ElementName引用它,我假设Binding.ElementName与FindName一样工作……是的,DataContext也可以工作,但我想了解x:Name,FindName(,ElementName)如何协同工作,以供将来参考并避免更多错误。@aKzenT,看一看,这是我在这个主题上看到的最好的。谢谢,它很好地解释了WPF中逻辑树和视觉树之间的区别。然而,在MSDN中,FindName在XAML名称范围上工作,它应该独立于此。另外,当我将页面的Background属性设置为SolidColorBrush并为该笔刷命名时,它将显示在FindName中,那么区别在哪里呢?为什么它不适用于DataContext?
    Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)
        MyBase.OnNavigatedTo(e)
        ViewModel.Initalize() '<-- Exception here
    End Sub