2010-08-25 42 views
2

我正在努力解決如何根據項目的大小和數量更改模板。這與根據大小或Windows 7縮略圖程序動態更改的功能區非常相似。WPF:根據項目的大小和數量使用不同的模板

在這種情況下,它是一個ListBox的ItemTemplate,我想減小圖像的大小或不顯示它,而不是滾動條。

<ListBox ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding Title}" />       
       <Image Source="{Binding ImageUrl}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

感謝

回答

4

您可以在ListBox上設置一個樣式,它根據項目數切換ItemTemplate。

<ListBox ItemsSource="{Binding Items}"> 
    <ListBox.Resources> 
     <local:SizeConverter x:Key="SizeConverter"/> 
     <DataTemplate x:Key="SmallTemplate"></DataTemplate> 
     <DataTemplate x:Key="MediumTemplate"></DataTemplate> 
     <DataTemplate x:Key="LargeTemplate"></DataTemplate> 
    </ListBox.Resources> 
    <ListBox.Style> 
     <Style TargetType="ListBox"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Small"> 
        <Setter Property="ItemTemplate" Value="{StaticResource SmallTemplate}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Medium"> 
        <Setter Property="ItemTemplate" Value="{StaticResource MediumTemplate}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Large"> 
        <Setter Property="ItemTemplate" Value="{StaticResource LargeTemplate}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.Style>    
</ListBox> 

的SizeConverter將返回基於輸入的計數大小類別的的IValueConverter,轉換方法可以是這樣的:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    int count = (int)value; 
    if (count < 4) return "Large"; 
    if (count < 12) return "Medium";    
    return "Small"; 
} 
+0

謝謝 - 已將ListBox.ItemTemplate綁定到一個IMultiValueConverter,該IMultiValueConverter接受可用的大小和項目數並返回相應的資源。 – escouser 2010-08-26 11:57:11

3

你可能想使用WPF的DataTemplateSelector功能:

從鏈接:

通常情況下,你創建一個 DataTemplateSelector當你有比 更多一個DataTemplate的 相同類型的對象,你想 供應根據每個數據對象的 屬性選擇適用的 DataTemplate。注意 如果您有不同的 類型的對象,您可以在DataTemplate上設置DataType 屬性。如果你 這樣做,那麼沒有必要 創建一個DataTemplateSelector。 此外,如果您有 相同類型但具有不同 屬性的對象,則還可以使用DataTrigger或數據 轉換器考慮 。有關更多信息,請參閱 數據模板概述。

或者,如上所述,DataTrigger可能是有用的。

+1

一個DataTemplateSelector是指基於一個單獨的項目來切換它是或應該獨立於其他項目:如果項目被添加到集合中,那麼是否也會爲所有現有項目調用templateselector?所有模板會刷新嗎?我不確定,但我不這麼認爲。 – Bubblewrap 2010-08-26 06:20:21

+0

好點 - 在父控制上適當的屬性的數據觸發器可能是前進的方向。 – cristobalito 2010-08-26 08:12:51

相關問題