WPF ListBox ItemsContainersStyle растянуть элементы - PullRequest
0 голосов
/ 14 марта 2019

Я использую C # .Net 4.7.2 и WPF 4.5.2

Я хочу создать представление с несколькими столбцами.Каждый столбец содержит количество строк.Точное число строк может отличаться от одного столбца к другому.

Вот пример: enter image description here

Для достижения того, что видно на рисунке I 'мы пробовали этот xaml

<UserControl x:Class="MyNamespace.MyView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="1080" d:DesignWidth="1920">


    <ListBox ItemsSource="{Binding Groups}" HorizontalAlignment="Left" VerticalContentAlignment="Top" Padding="0">

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemTemplate>
            <DataTemplate>

                <Grid HorizontalAlignment="Stretch">

                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"    />
                        <RowDefinition Height="Auto"    />
                    </Grid.RowDefinitions>

                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"  />
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Row="0" Text="{Binding GroupHeader}" HorizontalAlignment="Stretch" />


                    <ListBox Grid.Row="2" ItemsSource="{Binding RowElements}"                              
                             HorizontalAlignment="Stretch"
                             BorderThickness="0"                              
                             Margin="0">

                        <ListBox.ItemContainerStyle>

                            <Style TargetType="{x:Type ListBoxItem}">

                                <Setter Property="HorizontalAlignment"      Value="Stretch" />
                                <Setter Property="Margin"                   Value="0"       />

                            </Style>

                        </ListBox.ItemContainerStyle>

                        <ListBox.ItemTemplate>
                            <DataTemplate>


                                <Grid HorizontalAlignment="Stretch">

                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="50"    />
                                        <ColumnDefinition Width="*"       />
                                    </Grid.ColumnDefinitions>



                                    <TextBox    Grid.Column="0" Text="{Binding RowHeader}"                                                   
                                                IsReadOnly="True"                                                    
                                                TextAlignment="Left"
                                                HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
                                                VerticalAlignment="Stretch"  VerticalContentAlignment="Center" />

                                    <TextBox    Grid.Column="1" Text="{Binding RowValue}"                                                    
                                                TextAlignment="Left"
                                                HorizontalAlignment="Stretch" HorizontalContentAlignment="Left"
                                                VerticalAlignment="Stretch"  VerticalContentAlignment="Center"/>

                                </Grid>

                            </DataTemplate>
                        </ListBox.ItemTemplate>

                    </ListBox>


                </Grid>


            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>

</UserControl>

вместе с этой моделью представления (упрощенно)

using System.Collections.ObjectModel;
using System.Windows.Controls;

namespace MyNamespace
{

    public class Group
    {
        public string GroupHeader { get; set; }

        public ObservableCollection<RowElement> RowElements { get; set; }


    }


    public class RowElement
    {
        public string RowHeader { get; set; }

        public double RowValue { get; set; }
    }



    public partial class MyView : UserControl
    {



        public MyView()
        {
            InitializeComponent();

            Groups = new ObservableCollection<Group>();            
            Group group;


            group = new Group() { GroupHeader = "GroupHeader 1", RowElements = new ObservableCollection<RowElement>() };
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 1" , RowValue = 5d } );
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 2" , RowValue = 3.2d } );
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 3" , RowValue = 1.9d } );
            Groups.Add( group );

            group = new Group() { GroupHeader = "GroupHeader 2" , RowElements = new ObservableCollection<RowElement>() };
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 1" , RowValue = 4d } );
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 2" , RowValue = 9d } );            
            Groups.Add( group );

            group = new Group() { GroupHeader = "GroupHeader 3" , RowElements = new ObservableCollection<RowElement>() };
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 1" , RowValue = 4.32d } );
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 2" , RowValue = 7.98d } );
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 3" , RowValue = 2.36d } );
            group.RowElements.Add( new RowElement() { RowHeader = "RowHeader 4" , RowValue = 12d } );
            Groups.Add( group );
        }


        public ObservableCollection<Group> Groups { get; set; }

    }
}

Как вы можете видеть на рисунке, элементы LixtBoxItems в верхнем уровне ListBox должны быть полностью растянуты.Независимо от того, что я делаю, элементы отображаются с тем размером, который им действительно нужен, а не с постоянным размером.

Что я делаю не так?

...