因爲有兩種不同類型的項目,我認爲你最好的選擇是創建一個自定義列表框子類,添加一個新的DependencyProperty以允許你綁定和顯示第二個列表。這也需要一個新的默認樣式在正常的<ItemsPresenter/>
相同的ScrollViewer中適當地顯示第二個列表。
這裏是我的自定義列表框的例子,讓這樣的:
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); }
}
}
那麼你將不得不整個默認列表框樣式複製到你的主題/ 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>
正如你可以看到我修改通常只包含ItemsPresenter爲的ScrollViewer ListBox並用一個StackPanel替換它,該StackPanel包含綁定到新添加到MyListBox的新StaticItems DependencyProperty的新ItemsControl。我修改了這個ItemsControl的DataTemplate以顯示一個TextBox。具有普通ItemsTemplate的普通ItemsPresenter會顯示在ScrollViewer的靜態列表下方。
然後,可以使用此自定義列表框來代替普通列表框來綁定到您的ViewModel中的兩個不同列表,這兩個列表都是靜態項目和動態項目。
<custom:MyListBox x:Name="ListBox" ItemsSource="{Binding DynamicItems}" StaticItems="{Binding StaticItems}"/>
我曾經想過這一點,但問題是靜態項目不同於動態項目(靜態項目包含一個文本框;動態項目包含一個textBlock)。你可以創建兩個dataTemplates並在不同的情況下在同一個數據源上使用它們嗎? – chief7 2010-06-29 17:47:47
您是否嘗試過使用DataTemplateSelector?你可以在http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx找到更多信息。 – 2010-07-01 05:19:39
這僅在WPF中受支持。我正在Silverlight for Windows Phone 7工作。 – chief7 2010-07-01 13:26:16