2010-08-03 54 views
0

我需要根據列表框項目數來更改我的列表框的DataTemplate。我想出了下面的XAML代碼:WPF:根據列表框的項目動態更改列表框的ItemTemplate項目大小

<Window.Resources> 
    <DataTemplate x:Key="DefaultTemplate"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="{Binding Path=Text}"/> 
    <TextBlock Text="default template" /> 
    </StackPanel> 
    </DataTemplate> 
    <DataTemplate x:Key="OtherTemplate"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="{Binding Path=Text}"/> 
    <TextBlock Text="other template" /> 
    </StackPanel> 
    </DataTemplate>  
</Window.Resources> 
<ListBox Name="listBox1" ItemsSource="{Binding Path=Items}"> 
    <ListBox.Style> 
    <Style TargetType="{x:Type ListBox}"> 
     <Setter Property="ItemTemplate" Value="{StaticResource DefaultTemplate}" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=Items.Count}" Value="1"> 
      <Setter Property="ItemTemplate" Value="{StaticResource OtherTemplate}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </ListBox.Style>  
</ListBox> 

通過上述XAML,一旦我添加了兩個或多個項目的綁定列表,數據模板改變預期(其他爲默認值)。但是,如果我用兩個以上的項目刪除列表中的第一個項目,則整個列表框將變爲空(我確認綁定列表非空)。刪除兩項列表中的第二項可以正常工作(即模板從默認更改爲其他)。

任何想法爲什麼會發生這種情況?或者,也許我錯誤地解決了這個問題?

回答

2

您可以使用數據觸發器,或者您可以使用DataTemplateSelectorHere是顯示基本知識的文章。 here是將它應用於項目控件的MSDN(也是一個列表框)

2

我不能說出確切的問題或原因,但這是因爲DataTrigger在count爲1時設置模板並且只有1.

你可以做3件事之一來解決這個問題,但只有1我會推薦。從System.Windows.TriggerBase

b獲得)使用的System.Windows.Data.IValueConverter的實現,將從ItemsControl.Items.Count轉換成一個DataTemplate

一)實現自己的DataTrigger。通過將一個元素作爲Binding.ConverterParameter放置在資源的作用域中,將它們轉換爲FrameWorkElement並調用FrameWorkElement.FindResource()來檢索模板。 C)這是我的建議,寫你自己的DataTemplateSelector做咕嚕作品。該機制專門針對您實現的功能。我最近寫了一個,它將根據源對象的類型選擇一個DataTemplate,而不需要沒有x:Key集的DataTemplate。在模板選擇器上使用屬性,可以使用XAML將DataTemplates傳遞到DataTemplateSelector中,移除FindResource代碼的「待辦事項」列表。