以编程方式设置DataTemplate时的WPF/Silverlight绑定

以编程方式设置DataTemplate时的WPF/Silverlight绑定,wpf,silverlight,data-binding,datatemplate,accordion,Wpf,Silverlight,Data Binding,Datatemplate,Accordion,我有我的小设计工具我的程序 在左边我有TreeView,在右边我有手风琴 当我选择一个节点时,我想根据所选节点的DataContext属性动态构建手风琴项目 选择节点可以很好地工作,当我使用这个示例代码进行测试时,它也可以工作 XAML代码: <layoutToolkit:Accordion x:Name="accPanel" SelectionMode="ZeroOrMore" Selec

我有我的小设计工具我的程序

在左边我有TreeView,在右边我有手风琴

当我选择一个节点时,我想根据所选节点的DataContext属性动态构建手风琴项目

选择节点可以很好地工作,当我使用这个示例代码进行测试时,它也可以工作

XAML代码:

<layoutToolkit:Accordion x:Name="accPanel"
                         SelectionMode="ZeroOrMore"
                         SelectionSequence="Simultaneous">
  <layoutToolkit:AccordionItem Header="Controller Info">
    <StackPanel Orientation="Horizontal" DataContext="{Binding}">
      <TextBlock Text="Content:" />
      <TextBlock Text="{Binding Path=Name}" />
    </StackPanel>
  </layoutToolkit:AccordionItem>
</layoutToolkit:Accordion>
C代码:

private void treeSceneNode_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
   if (e.NewValue != e.OldValue)
   {
      if (e.NewValue is SceneNode)
      {
         accPanel.DataContext = e.NewValue; //e.NewValue is a class that contains Name property
      }
   }
 }
但是,当我试图使用DateTemplate和动态构建AccordingItem实现此目标时,出现了问题,绑定不起作用:

<layoutToolkit:Accordion x:Name="accPanel"
                         SelectionMode="ZeroOrMore"
                         SelectionSequence="Simultaneous" />
和我的ResourceDictionary中的DataTemplate

<DataTemplate x:Key="dtSceneNodeContent">
   <StackPanel Orientation="Horizontal" DataContext="{Binding}">
      <TextBlock Text="Content:" />
      <TextBlock Text="{Binding Path=Name}" />
   </StackPanel>
</DataTemplate>
和C代码:

private void treeSceneNode_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
  if (e.NewValue != e.OldValue)
  {
    ResourceDictionary rd = new ResourceDictionary();
    rd.Source = new Uri("/SilverGL.GUI;component/SilverGLDesignerResourceDictionary.xaml", UriKind.RelativeOrAbsolute);

    if (e.NewValue is SceneNode)
    {
      accPanel.DataContext = e.NewValue;

      AccordionItem accController = new AccordionItem();
      accController.Header = "Controller Info";
      accController.ContentTemplate = rd["dtSceneNodeContent"] as DataTemplate;

      accPanel.Items.Add(accController);
    }
    else
    {
      // Other type of node
    }
  }
}
你错过这个了吗

accController.Content = e.NewValue;

另外,我认为您不需要使用DataContext={Binding};DataContext仍将继承。

是否可以展开“不工作”-异常,结果不正确,什么也没有发生?您在输出窗口中看到任何绑定错误吗?您好,itowlson,输出中没有任何异常或错误。简单地说,第一个正确的静态示例向我展示了内容:场景根节点,其中场景根节点来自Name属性。第二个错误,动态示例仅显示内容:。我不知道问题出在哪里。是的,我检查了输出窗口,但什么都没有。这两种情况都是正确的。我认为设置accPanel.DataContext=e.NewValue;会将数据传播到各个项目,但我确实错了。非常感谢。