2014-09-25 2 views
0

Я пытаюсь назначить объект datacontext из TabItem. Для того, чтобы получить представление о том, рассмотрим следующий пример кодаНазначение datacontext для автогенерируемого tabitem в tabcontrol

<UserControl x:Class="CustomCopyNas.UserControls.LoginUsers" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:igWindows="http://infragistics.com/Windows" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 

    <Grid Margin="5,0,5,0"> 
     <igWindows:XamTabControl Name="_xamTabControl" 
      TabLayoutStyle="MultiRowSizeToFit" 
      MaximumTabRows="4" 
      MaximumSizeToFitAdjustment="50" 
      MinimumTabExtent="100" 
      InterTabSpacing="2" 
      InterRowSpacing="2" 
      Theme="Metro" 
      AllowTabClosing="False" 
      TabItemCloseButtonVisibility="WhenSelectedOrHotTracked"> 
      <igWindows:XamTabControl.ContentTemplate> 
       <DataTemplate> 
        <TextBox Text="{Binding Prop}"/> 
       </DataTemplate> 
      </igWindows:XamTabControl.ContentTemplate> 
     </igWindows:XamTabControl> 
    </Grid> 
</UserControl> 

Как вы можете видеть, я использую DataTemplate для TabItem внешний вид контента, TextBox. Свойство TextBox Text является обязательным для свойства из datacontext.

И частичный класс от UserControl

public class Foo 
{ 
    public string Prop { 
     get { return "Hello Foo"; } 
    } 
} 

/// <summary> 
/// Interaction logic for LoginUsers.xaml 
/// </summary> 
public partial class LoginUsers : UserControl 
{ 
    public LoginViewModel LoginViewModel = new LoginViewModel("file.xml"); 

    public LoginUsers() 
    { 
     InitializeComponent(); 

     foreach (var server in LoginViewModel.ServerUsers) 
     { 
      string header = server.Server; 
      string name = "tabItem" + header; 
      _xamTabControl.Items.Add(new TabItemEx() { Header = header, Name = name, DataContext = new Foo() }); 
     } 
    } 
} 

В выходе на содержание TabItem У меня нет ничего, так что содержание, пуста почему?

ответ

1

Возможно, вы неправильно указали свой TabControl XAML. Принято, чтобы она определяется больше, как это, используя TabControl.ItemsSource свойство:

<TabControl ItemsSource="{Binding YourCollectionProperty}"> 
    <TabControl.ItemTemplate> <!-- Header Template--> 
     <DataTemplate> 
      <TextBlock Text="{Binding HeaderText}" /> 
     </DataTemplate> 
    </TabControl.ItemTemplate> 
    <TabControl.ContentTemplate> <!-- Body Template--> 
     <DataTemplate> 
      <TextBlock Text="{Binding BodyText}" /> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

Для этого на работу, вам нужно создать пользовательский класс, который имеет HeaderText и BodyText свойства в нем. Затем вам нужно создать свойство коллекции public ObservableCollection<YourCustomClass> в вашем коде по имени YourCollectionProperty.

Пожалуйста, обратите внимание, что Binding s внутри двух DataTemplate с автоматически будет иметь их DataContext s установлен на элемент из YourCollectionProperty коллекции, и именно поэтому ваш Binding в Prop собственность не работает.

+0

Я использую элементы управления infragistics. Моя цель - создать динамику TabItem, зависит от количества доступных элементов. Например, если 5 элементов создадут 5 вкладок. Это потому, что выше, я делаю foreach для создания новой вкладки, зависит от элементов. –

+0

Вы все еще можете сделать это вот так. Для каждого требуемого 'TabItem' просто добавьте еще один элемент в коллекцию' YourCollectionProperty'. Использование свойства 'ItemsSource' предпочтительнее использования свойства' Items' в WPF. – Sheridan

+0

Я стараюсь следовать, но не работает. Https://gist.github.com/kostonstyle/b54b453ae664cf12d222 –

0

Попробуйте переместить петлю foreach так, чтобы она срабатывала при срабатывании события _xamTabControl.Loaded. Это должно сделать трюк

Смежные вопросы