Поскольку существует два разных типа элементов, я думаю, что лучше всего было бы создать собственный подкласс 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}"/>
person
Dan Auclair
schedule
02.07.2010