Список WPF .NET4.0 и ItemsControl

#wpf #.net-4.0

#wpf #.net-4.0

Вопрос:

Я пытаюсь заполнить список элементами. ItemsSource Заключается в следующем:

 public SortedDictionary<string, List<int>> AvailableValues
  

когда у меня есть следующие элементы, кажется, что они хорошо разложены. За исключением того, что я не могу выбрать весь элемент и выполнить над ним какую-либо функцию.

 <ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" >
        <ItemsControl ItemsSource="{Binding AvailableValues}">

            <ItemsControl.Template>
                <ControlTemplate>
                    <CustomControls:UniformWrapPanel IsItemsHost="True"/>
                </ControlTemplate>
            </ItemsControl.Template>

            <ItemsControl.ItemTemplate>
                <DataTemplate>

                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="60"/>
                        </Grid.ColumnDefinitions>


                        <Label  Grid.Row="0" Grid.Column="0" Content="{Binding Key}" />
                        <ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding Value}" SelectedItem="{Binding SelectedInputValue, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True" />

                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
  

Я попытался заменить ItemsControl на ListBox (а также ListBox.ItemTemplate ) и, похоже, не могу получить отображение, где Label Content выровнено по левому краю, а Combobox содержимое выровнено по правому краю.

UniformWrapPanel Взято из статьи CodeProject.

Спасибо,

Ответ №1:

Если основной проблемой является выравнивание, вы можете попытаться перенести метку и поле со списком в сетку. установите горизонтальное выравнивание растянутым для сетки и установите горизонтальное выравнивание левым для объектов.

Установка минимального максимального размера необязательна, но может быть полезна

 <Grid HorizontalAlignment="Stretch">
            <Grid.ColumnDefinitions>
            <ColumnDefinition  MinWidth="55" />
            <ColumnDefinition Width="0.636*" />
            </Grid.ColumnDefinitions>
            <Label Grid.Column="0" HorizontalALignment="Left"/>
            <ComboBox Grid.Column="1" HorizontalAlignment="Left"/>
        </Grid>
  

Комментарии:

1. Спасибо @randyc. Странно, что он теряет график даже с приведенным выше определением, но с двумя элементами, содержащимися в a, для StackPanel которых Oriention установлено значение Horizontal . Однако приведенное выше определение сделало свое дело!

Ответ №2:

ItemsControl Это не то же самое, что a ListBox — он не содержит возможностей выбора.

Лучше всего использовать фактический список и изменить ItemTemplate для отображения содержимого так, как вы этого хотите.

 <ListBox x:Name="MyListBox" ItemsSource="{Binding AvailableValues}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="60"/>
                </Grid.ColumnDefinitions>

                <Label  Grid.Row="0" Grid.Column="0" Content="{Binding Key}" />
                <ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding Value}" />

            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
  

Комментарии:

1. Приветствую @Rachel. Я потратил довольно много времени даже на Canvas настройку под ItemsPanel . В конце концов, предложение @ randyc сделало свое дело.