2014-09-21 76 views
0

我创建了一个名为EventMenu的小型UserControl。我参考它在一个更大的观点使用:无法声明性地设置自定义UserControl的DataContext

<views:EventMenu 
    Grid.Row="1" 
    DataContext="{Binding DataContext.ServicingEventsMenuViewModel}" 
    /> 

(我也试过DataContext="{Binding Path=DataContext.ServicingEventsMenuViewModel}")。

但是,没有从绑定的数据上下文的内容显示在控制(从控制的XAML文件确实出现静态内容)。我相信控件不绑定DataContext。

在后面的构造为用户控件的代码,我已经做到了这一点:

public EventMenu() 
    { 
     InitializeComponent(); 
     if (DataContext == null) 
     { 
      Console.WriteLine("No data context!"); 
     } 
    } 

,它确实表明,在DataContext为空。

什么我需要做的,以确保DataContext设置在我的用户?

+1

是否较大视图的DataContext的有属性'ServicingEventsMenuViewModel'? – 2014-09-21 19:24:08

+1

@LarryLustig如果它包含'ServicingEventsMenuViewModel'属性,那么很可能你不需要绑定路径中的'DataContext'部分。基本上,在你的情况下,它会尝试找到这样'DataContext.DataContext.ServicingEventsMenuViewModel'属性,因为它会尝试采取从当前'DataContext'属性值 – dkozl 2014-09-21 19:47:41

+0

也对与绑定任何故障给定的路径,你可以查看输出窗口看看那里是否有任何错误报告。 – 2014-09-21 19:56:51

回答

0

第一错误的事情我看是这样的:

DataContext="{Binding DataContext.ServicingEventsMenuViewModel}" 

的DataContext是FrameworkElement的的依赖项属性。

所以写东西喜欢写you'v时,你写它,就好像你的DataContext有一个名为DataContext属性,它是写这相当于:

DataContext="{Binding Path=DataContext.ServicingEventsMenuViewModel}" 

你们是不是要达到一个父元素的DataContext的? 如果是这样你需要(如果它的父是一个用户控件为例)写的是这样的:

DataContext="{Binding Path=DataContext.ServicingEventsMenuViewModel,RelativeSource={RelativeSource AncestorType={x:Type UserControl}" 

我猜这是这里的情况...

让我问你这个,后其中的xaml

<views:EventMenu /> 

是嵌套的,并且该类拥有ServicingEventsMenuViewModel属性。

我认为第二件事情是错的是检查,如果你的DataContext的是在构造空,即使你没有写正确的绑定声明此属性仍然是在构造函数中无效。

订阅FrameworkElement的的Loaded事件,并检查它。

+0

谢谢。我首先用'Path'构造尝试了相同的结果。我想要设置为嵌套UserControl的DataContext的视图模型是外部视图的DataContext的属性 - 我不需要追溯到额外的级别。我的控件嵌套在一个非常大的XAML文件中(这是给我的,我试图将其重构成更小的块)。我将在明天工作时尝试创建一个最小例子。 – 2014-09-22 00:09:12

+0

您需要使用relativesource,并且您不需要路径中的DataContext – 2014-09-22 05:36:32

相关问题