Поскольку существует два различных типа элементов, я думаю, что лучше всего было бы создать собственный подкласс ListBox, который добавляет новый DependencyProperty, чтобы позволить вам связывать и отображать второй список .Для этого также потребуется новый стиль по умолчанию для отображения второго списка соответствующим образом в том же ScrollViewer, что и обычный <ItemsPresenter/>
.
Вот пример моего собственного ListBox, позволяющего это:
public class MyListBox : ListBox
{
public MyListBox()
: base()
{
this.DefaultStyleKey = typeof(MyListBox);
}
public static readonly DependencyProperty StaticItemsProperty = DependencyProperty.Register(
"StaticItems",
typeof(IList),
typeof(MyListBox),
null);
public IList StaticItems
{
get { return (IList)GetValue(StaticItemsProperty); }
set { SetValue(StaticItemsProperty, value); }
}
}
Затем вам придется скопировать весь стиль ListBox по умолчанию в свой словарь ресурсов themes / generic.xaml и изменить его, чтобы он стал стилем по умолчанию для элемента управления MyListBox.Единственное, что я изменил из стиля по умолчанию (кроме атрибута TargetType), это содержимое ScrollViewer, у которого был оригинальный список:
<Style TargetType="custom:MyListBox">
<!-- all the same old XAML for the normal ListBox -->
<ScrollViewer x:Name="ScrollViewer" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="0" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}">
<StackPanel Orientation="Vertical">
<ItemsControl ItemsSource="{TemplateBinding StaticItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsPresenter/>
</StackPanel>
</ScrollViewer>
<!-- rest of the same old ListBox XAML -->
</Style>
Как вы можете видеть, я модифицировал ScrollViewer, который обычно просто содержалItemsPresenter для ListBox и заменил его на StackPanel, содержащую новый ItemsControl, связанный с новым StaticItems DependencyProperty, который я добавил в MyListBox.Я изменил DataTemplate для этого ItemsControl, чтобы показать TextBox.Обычный ItemsPresenter с обычным ItemsTemplate будет отображаться под статическим списком в ScrollViewer.
Этот пользовательский ListBox можно затем использовать вместо обычного ListBox для привязки к двум различным спискам в вашей ViewModel, причемваши статические предметы и ваши динамические предметы.
<custom:MyListBox x:Name="ListBox" ItemsSource="{Binding DynamicItems}" StaticItems="{Binding StaticItems}"/>