2010-07-26 82 views
1

我有一個組合框定義如下:如何修改Silverlight的組合框的數據顯示

<ComboBox x:Name="cboDept" Grid.Row="0" Margin="8,8,8,8" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" 
        ItemsSource="{Binding Source={StaticResource cvsCategories}}"> 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Vertical" Width="Auto" Height="Auto"> 
         <sdk:Label Content="{Binding CategoryID}" Height="20" /> 
         <sdk:Label Content="{Binding CategoryName}" Height="20" /> 
        </StackPanel> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 

它工作正常。但是,一旦我選擇了列表中的項目,我想要將不同的模板應用於顯示給用戶的組合框選定項目(彈出消失後顯示的項目)。在上面的情況下,我希望只有在選擇相應的項目後才能在ComboBox中顯示CategoryName。

任何人都可以讓我知道如何做到這一點?

感謝

回答

0

你需要做的是創建一個包含自己幾個定義的模板ResourceDictionary中。在下面,ComboBoxTemplateOne和ComboBoxTeplateTwo是用戶控件,用於顯示所需莊園中的組合框。

<UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate x:Key="TemplateOne"> 
       <local:ComboBoxTemplateOne /> 
      </DataTemplate> 
      <DataTemplate x:Key="TemplateTwo"> 
       <local:ComboBoxTemplateTwo /> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 

然後,您將需要創建自己的類,自ContentControl「DataTemplateSelector」繼承,覆蓋OnContentChanged

Protected Overrides Sub OnContentChanged(ByVal oldContent As Object, ByVal newContent As Object) 
    MyBase.OnContentChanged(oldContent, newContent) 

    Me.ContentTemplate = SelectTemplate(newContent, Me) 

    End Sub 

然後,您將需要創建另一個類,從上述DataTemplateSelector將覆蓋SelectTemplate繼承(「TemplateSelectorClass」),它將返回上面定義的DataTemplate(「TemplateOne」或「TemplateTwo」)。 此外,在這種派生類中,你需要定義一個屬性爲每個模板,你有

Public Property ComboboxTemplateOne As DataTemplate 

然後返回到您的XAML和n的打擊XAML

<local:TemplateSelectorClass ComboboxTemplateOne="{StaticResource TemplateOne}" Content="{Binding Path=ActiveWorkspace}> 

這應該工作,因爲它實際上是在設置WPF中的「DataTemplate」屬性(SilverLight中不存在)執行相同的工作。 我意識到這裏有一些公平的步驟,而且它非常複雜,但希望這會讓您有所收穫。任何問題都只是大喊大叫。