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

时间:2010-03-28 20:45:35

标签: wpf silverlight data-binding datatemplate accordion

我有我的小设计师工具(我的程序)。

在左侧我有TreeView,在右边的网站上我有手风琴。

当我选择一个节点时,我想根据所选节点的DataContext中的属性动态构建Accordion Items。

选择节点工作正常,当我使用此示例代码进行测试时,它也可以正常工作。

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实现这一点并动态构建FromItem时,Binding无法正常工作:

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

1 个答案:

答案 0 :(得分:0)

你错过了吗?

accController.Content = e.NewValue;

另外,我认为你不需要使用DataContext =“{Binding}”;无论如何DataContext都会继承。

相关问题