Comment configurer une grille en tant que modèle pour un contrôle Items?
Je suis en train de créer un ItemsControl
qui utilise une grille de son ItemsPanel
de telle manière qu'il y a deux colonnes, où les premières colonnes la largeur est la largeur du plus grand élément de cette colonne, et peut les lignes nécessaires pour afficher tous les éléments
Fondamentalement, je veux la suite, mais de toute façon à l'intérieur d'un ItemsControl
de sorte que je peux lier à une collection d'objets:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Label Content="{Binding Items[0].Header}"/>
<TextBox Text="{Binding Items[0].Content}" Grid.Column="1"/>
<Label Content="{Binding Items[1].Header}" Grid.Row="1"/>
<TextBox Text="{Binding Items[1].Content}" Grid.Row="1" Grid.Column="1"/>
<Label Content="{Binding Items[2].Header}" Grid.Row="2"/>
<TextBox Text="{Binding Items[2].Content}" Grid.Row="2" Grid.Column="1"/>
</Grid>
Edit : Rachels réponse très travaillé, voici un exemple de travail.
(J'ai déménagé de la Grille.IsSharedSizeScope="True" à la ItemsPanel, vous ne savez pas si Rachel destiné à mettre dans l'ItemTemplate (qui n'a pas fonctionné))
namespace WpfApplication23
{
public partial class Window1 : Window
{
public List<Item> Items { get; set; }
public Window1()
{
Items = new List<Item>()
{
new Item(){ Header="Item0", Content="someVal" },
new Item(){ Header="Item1", Content="someVal" },
new Item(){ Header="Item267676", Content="someVal" },
new Item(){ Header="a", Content="someVal" },
new Item(){ Header="bbbbbbbbbbbbbbbbbbbbbbbbbb", Content="someVal" },
new Item(){ Header="ccccccc", Content="someVal" }
};
InitializeComponent();
DataContext = this;
}
}
public class Item
{
public string Header { get; set; }
public string Content { get; set; }
}
}
<Window x:Class="WpfApplication23.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Grid.IsSharedSizeScope="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="ColumnOne" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="{Binding Header}"/>
<TextBox Text="{Binding Content}" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
source d'informationauteur pastillman
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs problèmes ici pour une
ItemsControl
:ItemsControl
La dernière est vraiment le plus gros problème, car un
ItemsControl
encapsule chaqueItemTemplate
dans unContentPresenter
donc il n'y a pas de défaut moyen de créer plus d'un élément dans le panneau à chaque Itération de laItemsControl
. Votre résultat final devrait ressembler à ceci:Ma meilleure suggestion serait de créer un
ItemTemplate
qui contient une 1x2Grid
et l'utilisationGrid.IsSharedSizeScope
faire de la largeur de la première colonne partagé. (LeItemsPanelTemplate
resterait le défautStackPanel
.)De cette façon, le résultat final devrait ressembler à ceci:
Vous pouvez utiliser un ListView
la ColumnHeaderContainerStyle cache la GridViewHeader