2010-01-13 148 views
1

我想申請一個DataTrigger改變DataTemplateListBox和正在錯誤如何改變的ListBox的DataTemplate WPF中:基於複選框

"Error 1 Cannot find the Trigger target 'IssueListBox'. (The target must appear before any Setters, Triggers, or Conditions that use it.)"

我在主體WindowListBox (在DockPanel連同其他控制):

<ListBox x:Name="IssueListBox" 
    ItemsSource="{Binding}" 
    ItemTemplate="{StaticResource ShowIssueSimple}" 
    IsSynchronizedWithCurrentItem="True" 
    HorizontalContentAlignment="Stretch" 
    BorderThickness="3" DockPanel.Dock="Top" 
    VerticalContentAlignment="Stretch" Margin="2"/> 

我有對DataTemplate個S IN的App.xaml有DataTrigger在第2模板的底部:

<DataTemplate x:Key="ShowIssueDetail"> 
     <Border CornerRadius="4, 8, 4, 8" Margin="2" MinWidth="400" BorderThickness="3" 
       BorderBrush="{Binding Path=IssUrgency, Converter={StaticResource IntToRYGBBoarderBrushConverter}}"> 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel Margin="10"> 
        <TextBlock Text="{Binding IssSubject}" FontWeight="Bold" FontSize="14"/> 
        <StackPanel Width="Auto" Orientation="Horizontal"> 
         <TextBlock Text="Due: " FontWeight="Bold"/> 
         <TextBlock Text="{Binding IssDueDate}" FontStyle="Italic" HorizontalAlignment="Left"/> 
        </StackPanel> 
        <StackPanel Width="Auto" Orientation="Horizontal"> 
         <TextBlock Text="Category: " FontWeight="Bold"/> 
         <TextBlock Text="{Binding IssCategory}"/> 
        </StackPanel> 
       </StackPanel> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 

    <DataTemplate x:Key="ShowIssueSimple"> 

     <Border CornerRadius="6" 
       Margin="2,1,2,1" 
       MinWidth="400" 
       BorderThickness="2" 
       SnapsToDevicePixels="True" 
       BorderBrush="{Binding Path=IssUrgency, Converter={StaticResource IntToRYGBBoarderBrushConverter}}"> 
      <StackPanel Margin="5"> 
       <TextBlock Text="{Binding IssSubject}" FontWeight="Bold" FontSize="14"/> 
      </StackPanel> 
     </Border> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Source={StaticResource sbvm}, Path=ShowDetailListItems}" Value="True"> 
       <Setter TargetName="IssueListBox" Property="ItemTemplate" Value="{StaticResource ShowIssueDetail}"/> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

如何獲得Trigger工作?谷歌先生讓我失望了,像這樣的例子很多,但他們不是基於另一種控制。

+0

在DataTrigger中,您將ItemTemplate設置爲包含它的DataTemplate - ShowIssueSimple。這只是一個錯字嗎?我猜你的意思是Value =「{StaticResource ShowIssueDetail}」。 – Tarsier 2010-01-13 03:32:25

+0

是的,是的一個「錯字」(: 感謝您的領導,修正 – 2010-01-13 03:38:44

回答

3

你的數據模板是一個在app.xaml中定義的StaticResource,你試圖做一個元素名綁定到不存在於同一個作用域中的IssueListBox元素。即使如此,你想要做的是這個。 Listbox有一個數據模板DT,在DT內部,您試圖返回到列表框並將其DataTemplate設置爲另一個(而不是DT)。

爲什麼不合並模板,將詳細信息的可見性設置爲摺疊並根據您的屬性觸發可見性。那麼你根本不必引用列表框,模板也保持不變,當你想看到細節時,它只是在內部改變。

+1

雖然我仍然想知道如何處理它,如果我需要兩個模板,當我剛剛添加時,生活是如此容易事件處理程序的checked.changed事件,但我正在努力開發更好的習慣,因爲我正在學習和做學習MVVMish,因爲我可以學習xaml – 2010-01-13 14:53:10

+1

您可以使用數據模板選擇器,但這是要決定數據模板當他們被添加時,而不是當屬性改變時。 – 2010-01-14 00:09:16