Поскольку существует два разных типа элементов, я думаю, что лучше всего создать пользовательский подкласс 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 по умолчанию в вашу тему/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. Обычный ItemPresenter с обычным ItemTemplate будет отображаться ниже статического списка в ScrollViewer.
Этот пользовательский ListBox может быть использован вместо обычного ListBox для привязки к двум различным спискам в ViewModel как для ваших статических элементов, так и для ваших динамических элементов.
<custom:MyListBox x:Name="ListBox" ItemsSource="{Binding DynamicItems}" StaticItems="{Binding StaticItems}"/>
Я тоже думал об этом, но проблема в том, что статический элемент отличается от динамических элементов (статический элемент содержит текстовое поле, динамические элементы содержат текстовый блок). Можете ли вы создать два dataTemplates и использовать их в разных случаях в одном источнике данных? – chief7
Вы пытались использовать DataTemplateSelector? Дополнительную информацию можно найти на странице http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx. –
Это поддерживается только в WPF. Я работаю в Silverlight для Windows Phone 7. – chief7