2010-11-15 74 views
0

我有问题将数据放入wpf TabItem上的控件。 我已经在xaml中定义了几个DataTemplates。这里是其中的一个:问题绑定数据到动态创建的WPF TabItem控件

<Window.Resources>
...
<DataTemplate x:Key="memoTab">
<TextBox Name="memoTextBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AcceptsReturn="True" />
</DataTemplate>
...
</Window.Resources>

我那么后面在代码中创建新的标签如下:

TabItem tab = new TabItem();
tab.Header = "Memo";
tab.ContentTemplate = (DataTemplate)FindResource("memoTab");
tab.ApplyTemplate();
System.Windows.Controls.TextBox tb = (System.Windows.Controls.TextBox)tab.Template.FindName("memoTextBox", tab);
if (tb != null) tb.DataContext = memo; //string memo is created earlier as linq query
tabControl.Items.Add(tab); //tabControl is xaml defined

问题是,TB总是空的,因此没有数据出现在文本框(文本框本身显示在选项卡中,它是功能)

我不使用xaml在tabControl中创建选项卡(除了第一个,它不使用DataTemplate并且很好)是因为它们是在运行时由用户添加和删除的。

任何想法?

回答

0

您可能需要获取TabItemContentPresenter。您可以参考MSDN

// Getting the ContentPresenter of tab 
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(tab); 

// Finding textBox from the DataTemplate that is set on that ContentPresenter 
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate; 
TextBox myTextBox = (TextBox)myDataTemplate.FindName("memoTextbox", myContentPresenter); 

的方法FindVisualChild ...

private childItem FindVisualChild<childItem>(DependencyObject obj) 
    where childItem : DependencyObject 
{ 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
     if (child != null && child is childItem) 
      return (childItem)child; 
     else 
     { 
      childItem childOfChild = FindVisualChild<childItem>(child); 
      if (childOfChild != null) 
       return childOfChild; 
     } 
    } 
    return null; 
} 
+0

只是更改为ContentTemplate.FindName不工作 - 它给了异常:此操作只适用于具有应用此模板元素。 – vdmpal 2010-11-15 15:44:53

+0

@vdmpal编辑答案,查看完整示例的链接,我用你的类型替换了变量。 – 2010-11-15 16:10:34

+1

嗯......当我尝试这个时,ContentPresenter的ContentTemplate始终为空。我甚至试图通过添加Loaded事件并在其中运行此代码来推迟它,但没有区别。 – vdmpal 2010-11-15 19:26:31