So richten Sie ein raster als Vorlage für ein itemscontrol-Steuerelement?
Ich versuche zu schaffen, eine ItemsControl
, die ein Gitter verwendet, wie seine ItemsPanel
in einer solchen Weise, dass es zwei Spalten, wobei die ersten Spalten der Breite ist die Breite der breiteste Eintrag in dieser Spalte, und hat, wie viele Datensätze benötigt, die zur Anzeige aller Elemente
Grundsätzlich möchte ich die folgenden, aber irgendwie innerhalb einer ItemsControl
so, dass ich binden können, um eine Sammlung von Objekten:
<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 Antwort, hat Super funktioniert, hier ist ein funktionierendes Beispiel.
(Ich zog das Gitter.IsSharedSizeScope="True", um die ItemsPanel, nicht sicher, ob Rachel soll es in der ItemTemplate (die nicht arbeiten))
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>
Im nicht sicher, wie das funktionieren würde, als ein Element in meinem Beispiel enthält die Header und den Inhalt.
verwenden Sie Ihre Phantasie, dude. Sonst geben Sie mir eine Stunde oder so bis zum Ende meiner Arbeit hier und ich kann Euch ein Beispiel.
Das Raster AttachedProperties, dass @HighCore erwähnt würden für eine dynamische Anzahl an Zeilen, aber es würde nicht funktionieren, für den rest von dem, was Sie zu tun versuchen. Siehe meine Antwort unten für mehr details, warum. 🙂
InformationsquelleAutor pastillman | 2013-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Probleme, die hier für eine
ItemsControl
:ItemsControl
Der Letzte ist wirklich das größte problem, weil ein
ItemsControl
wird jederItemTemplate
imContentPresenter
, so gibt es keine Standard-Weg, die Schaffung von mehr als ein Element in der Systemsteuerung für jede Iteration derItemsControl
. Ihr Endergebnis würde dann so Aussehen:Meine beste Vorschlag wäre z.B. ein
ItemTemplate
enthält eine 1x2Grid
, und verwenden SieGrid.IsSharedSizeScope
um die Breite der ersten Spalte geteilt. (DieItemsPanelTemplate
bleiben würde, die Standard -StackPanel
.)Diese Weise, das Endergebnis würde dann so Aussehen:
Dies hat Super geklappt, danke, (siehe mein edit)
Bitte beachten Sie, dass
Grid.IsSharedScope="True"
sollte festgelegt werden, auf den übergeordneten container, nicht auf die Kinder, die Netze. Das (ansonsten sehr gute und hilfreiche) Antwort ließ mich verwirrt mit, dassIsSharedScope
Eigenschaft.InformationsquelleAutor Rachel
Können Sie ein ListView -
den ColumnHeaderContainerStyle blendet die GridViewHeader
InformationsquelleAutor Smotsch