Проблема привязки данных к элементам управления в динамически создаваемом wpf TabItem - PullRequest
0 голосов
/ 15 ноября 2010

У меня проблема с помещением данных в элементы управления на wpf TabItem. Я определил несколько DataTemplates в xaml. Вот один из них:

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

Затем я создаю новую вкладку в коде следующим образом:

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

Проблема в том, что tb всегда равен нулю, и поэтому в текстовом поле не отображаются данные (само текстовое поле отображается на вкладке и работает)

Я не использую xaml для создания вкладок в tabControl (кроме первой, которая не использует DataTemplate и подходит), потому что они предназначены для добавления и удаления пользователем во время выполнения.

Есть идеи?

1 Ответ

0 голосов
/ 15 ноября 2010

Возможно, вам понадобится получить 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;
}
...