Как динамически добавить UserControl в ItemsControl?
У меня есть WPF UserControl, который динамически создается во время выполнения. В зависимости от взаимодействия с пользователем, от 1 до 5 из этих элементов управления создаются и должны быть добавлены в пользовательский интерфейс.
у меня есть ObservableCollection<PlayerSpec> PlayerSpecViews
в коде позади xaml.cs
Первоначально я пытался использовать Grid
и динамически добавляя RowDefinitions
но это не сработало. Элемент управления будет уменьшен в размере.
Затем я попытался использовать ItemsControl, но привязка не добавляла элемент управления, а вместо имени типа.
Как я могу использовать привязку данных, чтобы добавить элемент управления и поместить его вертикально? Бонусная информация может включать вертикальную полосу прокрутки, если это необходимо.
Мой текущий XAML и привязка следующие:
<ItemsControl Name="PlayerSpecItems"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding Source=PlayerSpecViews}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Height="95"
Width="175"
Margin="1">
<local:PlayerSpec/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Классы XAML:
<!-- PlayerSpec -->
<Border Style="{StaticResource InnerBorder}"
HorizontalAlignment="Stretch">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="98"/>
<ColumnDefinition Width="21"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Style="{StaticResource DefaultFont}"
Grid.Column="0"
Grid.Row="0"
VerticalAlignment="Stretch"
VerticalContentAlignment="Center"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Right"
Margin="1"
Content="Name"/>
<TextBox Style="{StaticResource DefaultFont}"
Name="PlayerName"
Background="Transparent"
Grid.Column="1"
Grid.Row="0"
Margin="1"/>
<Grid Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25"/>
<ColumnDefinition Width="25"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Label Style="{StaticResource DefaultFont}"
Grid.Column="2"
Grid.Row="0"
VerticalAlignment="Stretch"
VerticalContentAlignment="Center"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Content="Automaton"/>
<RadioButton GroupName="PlayerTypeGroup"
Name="PlayerAutomaton"
Grid.Column="1"
Grid.ColumnSpan="2"
Grid.Row="0"
Grid.IsSharedSizeScope="True"
VerticalAlignment="Center">
</RadioButton>
<Label Style="{StaticResource DefaultFont}"
Grid.Column="2"
Grid.Row="1"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Content="Human"/>
<RadioButton GroupName="PlayerType"
Name="PlayerHuman"
Grid.Column="1"
Grid.ColumnSpan="2"
Grid.Row="1"
Grid.IsSharedSizeScope="True"
VerticalAlignment="Center">
</RadioButton>
</Grid>
</Grid>
</Border>
1 ответ
Проблемы с вашим кодом
- У ItemsControl нет полосы прокрутки, поэтому необходимо добавить ScrollViewer
- Источник привязки ItemsSource ItemsControl установлен в PlayerSpecViews, который не выглядит нормально, я ожидаю, что он будет из datacontext
- Панель стека не используется в шаблоне данных
так что ваш пересмотренный код
<ScrollViewer>
<ItemsControl Name="PlayerSpecItems"
HorizontalContentAlignment="Stretch"
ItemsSource="{Binding PlayerSpecViews}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:PlayerSpec Margin="1"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
Так что этот код должен быть рендеринга local:PlayerSpec
для каждого элемента в вашей коллекции PlayerSpecViews, подвергаемого корректному связыванию