【问题标题】:WPF / Silverlight Binding when setting DataTemplate programmatically以编程方式设置 DataTemplate 时的 WPF / Silverlight 绑定
【发布时间】:2011-02-01 19:58:06
【问题描述】:

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

左侧是 TreeView,右侧是 Accordion。

当我选择一个节点时,我想根据所选节点的 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 实现此目标并动态构建根据项目时,会出现问题,绑定不起作用:

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

【问题讨论】:

  • 你能扩展一下“不工作”吗——异常,不正确的结果,什么也没有发生?您是否在“输出”窗口中看到任何绑定错误?
  • 您好 itowlson,我在输出中没有任何异常或错误。简单地说,第一个“正确”“静态”示例向我展示了“内容:场景根节点”,其中“场景根节点”来自名称属性。第二个“错误”、“动态”示例仅显示“内容:”。而且我无法弄清楚问题出在哪里。是的,我检查了输出窗口,没有任何内容。

标签: wpf silverlight data-binding datatemplate accordion


【解决方案1】:

你错过了吗?

accController.Content = e.NewValue;

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

【讨论】:

  • 你在这两种情况下都是对的。我认为设置 accPanel.DataContext = e.NewValue;会将数据传播到项目,但我确实错了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2011-10-22
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多