0

我在将数据放入 wpf TabItem 控件时遇到问题。我在 xaml 中定义了几个 DataTemplates。这是其中之一:

<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 并且很好),因为它们是由用户在运行时添加和删除的。

有任何想法吗?

4

1 回答 1

0

您可能需要获取ContentPresenter. TabItem您可以参考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;
}
于 2010-11-15T14:35:32.740 回答