WPF DataContext绑定不发生

时间:2011-03-02 20:47:04

标签: wpf data-binding controls

我有一个用户控件,它基于类似的DataTemplates动态嵌入了许多其他控件。

我的控件有一个ViewModel,它具有托管子控件的DataContext和ContentTemplate的可绑定属性。但是,当我运行模板时,绑定很好并初始化,但DataContext永远不会被拾取,即使使用DataContextChanged事件也是如此。

<ContentControl Name="SessionControl1" DataContext="{Binding SessionItem1}" ContentTemplate="{Binding Source={StaticResource ViewModel},Path=Session1Template}"  /> 

现在作为测试,我选择了一个我想要的可切换控件(AudioCard.xaml)并尝试在同一个地方直接使用它:

<local:AudioCard DataContext="{Binding SessionItem1}" />

这很好用,控件初始化就像动态情况一样,DataContextChanged事件用正确的绑定触发。这使我认为在ContentControl中绑定到DataContext不起作用。

两个问题: 1)有一种简单的方法来解决它吗?

2)有更好的方法吗?

编辑:根据第一个答案,我将代码更改为如下所示:

<ContentControl Name="SessionControl1" Grid.Row="0" Grid.Column="0" ClipToBounds="False" Height="128" Width="128"
                                        DataContext="{Binding SessionItem1}"
                                        ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}"  />

我可以看到代码进入我的内容模板选择器,但我的选择器中的对象是空的。我应该绑定其他东西吗?

2 个答案:

答案 0 :(得分:2)

好的,根据Elad建议在XAML中使用数据模板选择器并正确绑定到Content而不是DataContext,这段代码可以按照需要运行:

<ContentControl Name="SessionControl1" 
            Content="{Binding Source={StaticResource ViewModel},Path=SessionItem1}"                                        
            ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}"  />

答案 1 :(得分:1)

至于Q2:

为什么要绑定到ControlTemplate?

  1. 您可以简单地创建一个“捕获”特定类型(ViewModel中的属性)的DataTemplate,然后将根据您自动放入的对象显示模板,而无需绑定ControlTemplate

  2. 如果您在ViewModel中持有ControlTemplate属性(看起来就像这样),那么您违反了MVVM最重要的规则之一 - ViewModel知道关于视图的 nothing ,并且没有对控件或UI的引用。