none
WPF + C# - Problema: TabControl con pestañas dinámicas. RRS feed

  • Pregunta

  •   Buenas a todos. Les cuento: el problema a resolver que tengo entre manos es el de generar una ventana con un TabControl en donde el nro. de pestañas y el contenido de cada pestaña se define dinámicamente. Además, en contenido de las pestañas no es el mismo, es decir, las pestañas poseen distintos grupos de controles ya que presentan información diferente. Para sintetizar, el el código que sigue, he fijado el nro. de pestañas y los datos que se muestran en cada pestaña,  y lo con lo que necesito me ayuden es con la elección dinámica de la plantilla asociada al cuerpo de la pestaña en función de algún dato "discriminador", y que podría ser el valor del TextBox asociado al primer label.

                  

    MainWindow.xaml

    <Window x:Class="Contenedor02.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="500" Width="300">

        <Window.Resources>

            <DataTemplate x:Key="tabHeaderTemplate">
                <StackPanel Orientation="Horizontal" Margin="4">
                    <Ellipse Stroke="Black" StrokeThickness="1" Fill="Blue" Width="16" Height="16" /> 
                    <TextBlock Margin="4,0,0,0" VerticalAlignment="Center" FontSize="15" Text="{Binding Header}" />
                </StackPanel>
            </DataTemplate>

            <DataTemplate x:Key="tabContentTemplate1">
                <Grid>
                    <Label Content="Label" HorizontalAlignment="Left" Margin="50,44,0,0" VerticalAlignment="Top"/>
                    <TextBox HorizontalAlignment="Left" Height="23" Margin="110,47,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
                    <Label Content="Label" HorizontalAlignment="Left" Margin="50,75,0,0" VerticalAlignment="Top"/>
                    <TextBox HorizontalAlignment="Left" Height="23" Margin="110,75,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
                    <TextBox HorizontalAlignment="Left" Height="23" Margin="110,103,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
                    <Label Content="Label" HorizontalAlignment="Left" Margin="50,100,0,0" VerticalAlignment="Top"/>
                </Grid>
            </DataTemplate>

            <DataTemplate x:Key="tabContentTemplate2">
                <Grid>
                    <Label Content="Label" HorizontalAlignment="Left" Margin="50,44,0,0" VerticalAlignment="Top"/>
                    <TextBox HorizontalAlignment="Left" Height="23" Margin="110,47,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
                    <Label Content="Label" HorizontalAlignment="Left" Margin="50,75,0,0" VerticalAlignment="Top"/>
                    <TextBox HorizontalAlignment="Left" Height="23" Margin="110,75,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
                </Grid>
            </DataTemplate>        

        </Window.Resources>

        <TabControl x:Name="_tabs">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="HeaderTemplate" Value="{StaticResource tabHeaderTemplate}" />
                    <Setter Property="ContentTemplate" Value="{StaticResource tabContentTemplate2}" />                
                </Style>
            </TabControl.ItemContainerStyle>
        </TabControl>

    </Window>

    MainWindow.xaml.cs

    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

    namespace Contenedor02
    {
        /// <summary>
        /// Lógica de interacción para MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();

                _tabs.ItemsSource = new List<DataItem> {
    new DataItem { Header = "Header 1"},
    new DataItem { Header = "Header 2"},
    };
            }
        }
    }

    DataItem.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Contenedor02
    {
        class DataItem {
            public string Header { get; set; }
            
    }

      Desde ya muchas gracias.

    martes, 11 de noviembre de 2014 15:16