2010-12-02 4 views
0

Ich muss zwei Steuerelemente erstellen, die die gleiche Menge an Elementen enthalten (eine dynamische Menge), das erste Steuerelement stellt die Schlüssel dar, das zweite die Werte.Verbindung Breite/Höhe der Zelle in zwei verschiedenen Steuerungen?

Ich brauche es so, dass wenn der Benutzer die obere Spaltenbreite ändert, sollte es die gleiche Spalte in der unteren Reihe (der Werte) beeinflussen. Hier

ist ein Beispiel, was ich will:

<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 

Ergebnis:

Noch einmal, ich möchte ein zu schaffen, um der Lage sein, Datagrid-like Steuerung, die sogar Zellgrenzen unterstützt, und Zellenbreiten und -höhen sollten mit der anderen Steuerung verbunden sein ls Breite + erlauben Größe zu ändern.

Ich bevorzuge es, Xamly getan werden. Hinweis: Es handelt sich um ein benutzerdefiniertes Steuerelement, sodass ich bei Bedarf entsprechende Eigenschaften angeben kann. Bedenken Sie jedoch, dass die Höhe und Breite der Zellen dynamisch und individuell für bestimmte Spalten/Reihen sein muss.

In Bezug auf this Frage, ich habe es auf eine etwas andere Art und Weise (mit einem dritten Steuerelement für Zellen), aber die Frage ist immer noch die gleiche, möchte ich die Höhe Breite der Spalten und Zellen dynamisch sein, und Geben Sie dem Benutzer die Möglichkeit, die Größe zu ändern und sich gegenseitig zu beeinflussen.

UPDATE

decyclone's answer etwas, das ich umsetzen würde gerne, aber ich versuchte, das Beispiel, das er Einstellung vorgesehen, um die ItemsControlGrid.IsSharedSizeScope Eigenschaft auf true s, aber es hat nicht funktioniert, hier ist das Ergebnis (geerntete):

Ist es möglich, eine gemeinsame Größe Umfang zwischen zwei verschiedenen Kontrollen anzuwenden?

+0

Müssen Sie zwei separate 'ItemsControls' verwenden? Wenn Sie die Breite und Höhe der Zellen gleich halten wollen, warum verwenden Sie nicht ein einzelnes 'ItemsControl' mit zwei Zeilendaten' ItemTemplate'? – decyclone

+0

@decyclone, ja. Ich dachte, dass ich separate "ItemControls" verwenden muss, da sich mein spezielles Szenario etwas von dem obigen Beispiel unterscheidet. Ich habe Spalten und Zeilen dynamisch automatisch generiert (siehe [link] (http: // stackoverflow.com/questions/4251183/wpf-zwei-dimensionale-datagrid-listview "WPF zweidimensionale DataGrid/ListView?"), und ich möchte die Zellen ItemsSource getrennt bleiben, aber immer noch verbunden, solange es Zellgröße betrifft. – Shimmy

+0

Haben Sie überlegt, 'Shared Size' mit' SharedSizeGroup' und 'Grid.IsSharedSizeScope' zu ​​verwenden? – decyclone

Antwort

1

versuchte ich etwas und scheint zu funktionieren:

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: für die Probe

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

Und vergessen Sie natürlich nicht, Grid.IsSharedSizeScope = "True" im Root-Panel zu setzen, das beide ItemsControls enthält. – decyclone

+0

Ihr Beispiel funktioniert nicht wie erwartet, siehe meine aktualisierte Antwort. – Shimmy

+0

Code aktualisiert. Vorausgesetzt, vollständiger und vereinfachter Code. Es funktioniert. – decyclone