我有一个用户控件,它基于类似的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}" />
我可以看到代码进入我的内容模板选择器,但我的选择器中的对象是空的。我应该绑定其他东西吗?
答案 0 :(得分:2)
好的,根据Elad建议在XAML中使用数据模板选择器并正确绑定到Content而不是DataContext,这段代码可以按照需要运行:
<ContentControl Name="SessionControl1"
Content="{Binding Source={StaticResource ViewModel},Path=SessionItem1}"
ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}" />
答案 1 :(得分:1)
至于Q2:
为什么要绑定到ControlTemplate?
您可以简单地创建一个“捕获”特定类型(ViewModel中的属性)的DataTemplate,然后将根据您自动放入的对象显示模板,而无需绑定ControlTemplate
如果您在ViewModel中持有ControlTemplate属性(看起来就像这样),那么您违反了MVVM最重要的规则之一 - ViewModel知道关于视图的 nothing ,并且没有对控件或UI的引用。