Laden...

Panel mit ItemControl-Eigenschaften

Erstellt von DeSharper vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.521 Views
D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren
Panel mit ItemControl-Eigenschaften

Ich habe eine Liste mit Objekten, und würde diese gerne alle innerhalb eines Panels darstellen. Gibt es eine Möglichkeit das so elegant zu lösen, wie zum Beispiel bei ComboBoxen mit einem Binding an ItemsSource?
Mein Panel ordnet die Objekte in einem Hexagon-Gitter an, es würde also durchaus Sinn machen, wenn es auch über die Darstellung dieser Objekte (sechseckig) entscheiden würde.
Auch das würde ich mit einem ItemControl hinbekommen. Lässt sich das irgendwie auch mit einem Panel umsetzen. Oder gibt es andersrum irgendein ItemControl-Panel-Hybrid-Dings, was beides kann, oder sieht jemand eine Möglichkeit, wie ich mir sowas bauen kann?

2.079 Beiträge seit 2012
vor 7 Jahren

Das ItemsControl hat eine ItemsPanel-Eigenschaft.
Darin kannst Du bestimmen, welches Panel wie verwendet werden soll.

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren

Es sieht so aus, als würde das all meine Probleme lösen. Danke!
Langsam fange ich an WPF zu mögen 😃

D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren

bin endlich dazu gekommen das auszuprobieren, aber ich hab noch ein Problem. Und zwar schaffe ich es nicht in meinen Items die Attached Properties des HexagonGrid zu setzen.
Dieses Property legt die (logische) Position innerhalb des Gitters fest. Die darzustellenden Elemente kennen ihre Position und die soll sinnigerweise an dieses attached Property gebunden werden. Leider wird die Position offensichtlich nicht gesetzt.
Im LiveVisualTree sehe ich, dass da noch ein ContentPresenter zwischen HexagonGrid und meinem eigentlichen DatenElement ist (siehe Anhang), wahrscheinlich sollte ich die attached properties im ContentPresenter setzen, aber erstens weiß ich nicht wie ich da rankomme und zweitens weiß ich nicht, ob ich auf der Ebene des contentPresenters schon auf das DatenObjekt zugreifen kann?

Hier mal der xamlCode:


    <ItemsControl ItemsSource="{Binding Path=DataListTEST}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Style="{DynamicResource HexagonStyle}"
				            local:HexagonGrid.Row="{Binding Position.Y}" 
                            local:HexagonGrid.Column="{Binding Position.X}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:HexagonGrid />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 7 Jahren

Nachdem ich jetzt die halbe Nacht ungeduldig dran rumgefummelt hab, funktioniert es jetzt endlich. Es lag tatsächlich an dem ContentPresenter dazwischen. Dessen Eigenschaften ließen sich über ItemsControl.ItemContainerStyle setzen.

Alles noch nicht sauber, aber das Folgenden funktioniert jedenfalls.


    <ItemsControl ItemsSource="{Binding Path=DataListTEST}"
                  ItemContainerStyle="{StaticResource TESTContainerStyle}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Style="{DynamicResource HexagonStyle}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate> 
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <local:HexagonGrid />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

Und irgendwo anders:


    <Style x:Key="TESTContainerStyle" TargetType="ContentPresenter">
        <Setter Property="userControls:HexagonGrid.Row" Value="{Binding Position.Y}"/>
        <Setter Property="userControls:HexagonGrid.Column" Value="{Binding Position.X}"/>
    </Style>