无法以声明方式设置自定义UserControl的DataContext

时间:2014-09-21 19:21:44

标签: wpf xaml user-controls

我创建了一个名为EventMenu的小型UserControl。我使用以下方法在更大的视图中引用它:

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

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

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

在UserControl的构造函数背后的代码中,我已经完成了这个:

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

它确实表明DataContext为空。

我需要做些什么才能确保在UserControl上设置DataContext?

1 个答案:

答案 0 :(得分:0)

我看到的第一个错误是:

   DataContext="{Binding DataContext.ServicingEventsMenuViewModel}"

DataContext是FrameworkElement的依赖属性。

因此,在编写类似于你写的东西的时候,你写的就好像你的DataContext有一个名为DataContext的属性,它等同于写这个:

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

您是否尝试访问父元素的DataContext? 如果是这样你需要写这样的东西(例如,如果它的父亲是UserControl):

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

我猜这就是这种情况......

让我问你这个,发布

的xaml
  <views:EventMenu />

是嵌套的,并且该类包含ServicingEventsMenuViewModel属性。

我认为第二件事是错误的是在构造函数中检查你的DataContext是否为null,即使你写了正确的绑定语句,这个属性在构造函数中仍然是null。

订阅FrameworkElement的Loaded事件并在那里检查它。