2010-06-29 48 views
2

有沒有什麼辦法讓靜態和動態項目都有列表框?Silverlight列表框 - 靜態加上綁定項目

我正在寫一個Windows Phone 7應用程序,並希望在頂部或底部有一個靜態listboxItem,然後綁定來自viewModel的其他項目。我試着設置一個靜態listboxItem,然後也是一個dataTemplate,但靜態項目被動態項目取代。

編輯:

我發現幾個職位,說明如何創建一個從Control,它允許多個模板繼承的自定義控制。我該如何創建一個自定義控件,爲靜態項添加一個部分,這些靜態項總是存在而不管綁定。

回答

1

如果您正在嘗試執行MVVM並且也是雙向綁定ListBox的SelectedItem,那麼將一個集合綁定到ItemsSource屬性會更容易/更簡單。

你可以預先使用靜態項目在ViewModel中預先填充集合嗎?然後,您可以將動態項目合併到現有的集合中(可以從Web服務返回或返回任何內容)。看起來你會希望在你的ViewModel中使用這種邏輯,並且只將一個列表暴露給View以與ListBox一起使用。

+0

我曾經想過這一點,但問題是靜態項目不同於動態項目(靜態項目包含一個文本框;動態項目包含一個textBlock)。你可以創建兩個dataTemplates並在不同的情況下在同一個數據源上使用它們嗎? – chief7 2010-06-29 17:47:47

+1

您是否嘗試過使用DataTemplateSelector?你可以在http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx找到更多信息。 – 2010-07-01 05:19:39

+0

這僅在WPF中受支持。我正在Silverlight for Windows Phone 7工作。 – chief7 2010-07-01 13:26:16

0

因爲有兩種不同類型的項目,我認爲你最好的選擇是創建一個自定義列表框子類,添加一個新的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}"/>