【问题标题】:WPF DataContext Binding Not OccuringWPF DataContext 绑定未发生
【发布时间】:2011-07-07 14:11:57
【问题描述】:

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

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

<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}"  />

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

【问题讨论】:

    标签: wpf data-binding controls


    【解决方案1】:

    关于第二季度:

    为什么要绑定到 ControlTemplate?

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

    2. 如果您在 ViewModel 中持有 ControlTemplate 属性(看起来确实如此),那么您就违反了 MVVM 最重要的规则之一 - ViewModel 对视图一无所知 ,并且不包含任何对控件或 UI 的引用。

    【讨论】:

    • 好的,我创建了一个模板选择器类来获取我的数据模板,将它作为用户资源放置在 XAML 中,所以我的绑定现在看起来像这样:&lt;ContentControl Name="SessionControl1" Grid.Row="0" Grid.Column="0" ClipToBounds="False" Height="128" Width="128" DataContext="{Binding SessionItem1}" ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}" /&gt; 我可以在模板选择器类中设置断点并看到它被调用,但我对数据上下文的绑定仍然是空的。
    【解决方案2】:

    好的,根据 Elad 关于在 XAML 中使用数据模板选择器并正确绑定到 Content 而不是 DataContext 的建议,此代码可以正常工作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-20
      • 2012-11-05
      • 2013-02-02
      • 2021-07-19
      • 1970-01-01
      • 2012-12-25
      • 2013-11-16
      • 2010-11-01
      相关资源
      最近更新 更多