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>
Ein perfekter Anwendungsfall für @Rachel s "Raster" Angefügte Eigenschaften
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

Schreibe einen Kommentar