2010-12-02 26 views
0

J'ai besoin de créer deux contrôles qui contiennent le même nombre d'éléments (une quantité dynamique), le premier contrôle représente les clés, le second représente les valeurs. J'en ai besoin pour que lorsque l'utilisateur redimensionne la largeur de la colonne supérieure, il doit affecter la même colonne dans la rangée inférieure (des valeurs).Connexion largeur/hauteur de la cellule dans deux contrôles différents?

Voici un exemple de ce que je veux:

<Window 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 
    <ItemsPanelTemplate x:Key="ItemsPanelTemplate"> 
     <VirtualizingStackPanel Orientation="Horizontal"/> 
    </ItemsPanelTemplate> 
    </Window.Resources> 
    <StackPanel> 
    <ItemsControl ItemsSource="{Binding Keys}" 
        ItemsPanel="{StaticResource ItemsPanelTemplate}"/> 
    <ItemsControl Grid.Row="1" ItemsSource="{Binding Values}" 
        ItemsPanel="{StaticResource ItemsPanelTemplate}"/> 
    </StackPanel> 
</Window> 

Imports System.Collections.Specialized 
Class MainWindow 
    Private Sub Window_Loaded(ByVal sender As Object, 
          ByVal e As RoutedEventArgs) Handles MyBase.Loaded 
    DataContext = 
     New StringDictionary From 
     { 
     {"key1", "value1"}, 
     {"key2", "value2"}, 
     {"key3", "value3"}, 
     {"key4", "value4"} 
     } 
    End Sub 
End Class 

Résultat:

Encore une fois, je veux être en mesure de créer un semblable DataGrid contrôle qui prend même en charge les bordures de cellules et les largeurs de cellules et les hauteurs doivent être connectés à l'autre contrôle ls 'width + permet de redimensionner.

Je préfère que ce soit fait xamly. Note: c'est un contrôle personnalisé, donc je peux déclarer les propriétés appropriées si nécessaire. mais rappelez-vous que les hauteurs et la largeur des cellules doivent être dynamiques et individuelles à des colonnes/rangées spécifiques.

En référence à this question, je l'ai créé d'une manière légèrement différente (ayant un troisième contrôle pour les cellules), mais la question est toujours la même, je veux que la largeur hauteur des colonnes et des cellules soit dynamique, et donner à l'utilisateur la possibilité de les redimensionner les uns les autres.

MISE À JOUR

decyclone's answer est quelque chose que j'aimerais mettre en œuvre, mais j'ai essayé l'exemple qu'il a fourni définissant la propriété de ItemsControl s Grid.IsSharedSizeScope à vrai, mais il ne fonctionne pas, voici le résultat (recadrée):

Est-il possible d'appliquer un champ de taille partagée entre deux contrôles différents?

+0

Avez-vous besoin d'utiliser deux 'ItemsControls' séparés? Si vous souhaitez conserver la même largeur et la même hauteur des cellules, pourquoi ne pas utiliser un seul élément, ItemsControl, contenant deux données de ligne ItemTemplate? – decyclone

+0

@decyclone, oui. J'ai considéré que, je dois utiliser séparé ItemControl, puisque mon scénario particulier est légèrement différent de l'exemple ci-dessus. J'ai dynamiquement généré des colonnes et des lignes (voir [link] (http: // stackoverflow.com/questions/4251183/wpf-two-dimensional-datagrid-listview "GDF bidimensionnel DataGrid/ListView?"), et je veux garder les cellules ItemsSource séparées, mais toujours connecté tant qu'il s'agit de la taille des cellules. – Shimmy

+0

Avez-vous envisagé d'utiliser 'Shared Size' en utilisant' SharedSizeGroup' et 'Grid.IsSharedSizeScope'? – decyclone

Répondre

1

J'ai essayé quelque chose et semble fonctionner:

XAML:

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication2" 
     Title="MainWindow" 
     Height="350" 
     Width="525"> 
    <Window.Resources> 
     <local:GroupNameGenerator x:Key="GroupNameGenerator1" /> 
     <local:GroupNameGenerator x:Key="GroupNameGenerator2" /> 
    </Window.Resources> 
    <Grid> 
     <StackPanel Grid.IsSharedSizeScope="True"> 
      <ItemsControl Name="ItemsControl1"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal" /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition SharedSizeGroup="{Binding Converter={StaticResource GroupNameGenerator1}}" /> 
          </Grid.ColumnDefinitions> 
          <Border BorderBrush="Black" 
            BorderThickness="1" 
            Margin="5" 
            Padding="5"> 
           <TextBlock Text="{Binding}" /> 
          </Border> 
         </Grid> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
      <ItemsControl Name="ItemsControl2"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal" /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition SharedSizeGroup="{Binding Converter={StaticResource GroupNameGenerator2}}" /> 
          </Grid.ColumnDefinitions> 
          <Border BorderBrush="Black" 
            BorderThickness="1" 
            Margin="5" 
            Padding="5"> 
           <TextBlock Text="{Binding}" /> 
          </Border> 
         </Grid> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </StackPanel> 
    </Grid> 
</Window> 

code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
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; 
using System.Collections.ObjectModel; 

namespace WpfApplication2 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     ObservableCollection<Int32> list1 = new ObservableCollection<Int32>(); 
     ObservableCollection<String> list2 = new ObservableCollection<String>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      for (int i = 0; i < 25; i++) 
      { 
       list1.Add(i + 1); 
       list2.Add(new String('0', ((i + 1)/3))); 
      } 

      ItemsControl1.ItemsSource = list1; 
      ItemsControl2.ItemsSource = list2; 
     } 
    } 

    public class GroupNameGenerator : IValueConverter 
    { 
     public Int32 Index { get; set; } 

     public GroupNameGenerator() 
     { 
      Index = 0; 
     } 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return String.Format("Group{0}", ++Index); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
+0

Et bien sûr, n'oubliez pas de définir 'Grid.IsSharedSizeScope =" True "' sur le panneau Root qui contient les deux ItemsControls. – decyclone

+0

Votre exemple ne fonctionne pas comme prévu, voir ma réponse mise à jour. – Shimmy

+0

Le code a été mis à jour. Fourni code complet et simplifié. Ça marche. – decyclone

0

Salut vérifier le lien suivant pour l'échantillon. sites.google.com/site/html5tutorials/ParallelDataBinding.zip

L'échantillon joint est optimisé pour les colonnes. c'est-à-dire, grand nombre de colonnes et moins de lignes. L'échantillon contient 50K colonnes et 10 lignes. Rend moins d'une seconde.