2011-06-13 92 views
1

我有一個ListBox設置了一系列DataTemplates以基於數據類型正確顯示內容。我正在嘗試觸發每個DataTemplate的外觀,以便在選擇ListBoxItem時將其從「只讀」狀態更改爲「可編輯」狀態。我的目標是用「IsSelected」觸發器設置它,並相應地顯示/隱藏控件。用於ListBox項目的DataTemplate中的IsSelected的WPF觸發器

我定義下列方式我的DataTemplates:

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> 
     <vw:HeaderSlugView /> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:ContentSlugViewModel}"> 
     <vw:ContentSlugView /> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:ImageSlugViewModel}"> 
     <vw:ImageSlugView /> 
    </DataTemplate> 

每個 「視圖」 是一個獨立的XAML文件。我希望能夠在這些文件中設置觸發器,查看ListBoxItem的IsSelected屬性,以便控制其中各個控件的可見性。

覆蓋ListBoxItem的模板如下:

<Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border Name="SlugContainer" Background="Transparent" BorderBrush="Black" BorderThickness="1" CornerRadius="2" Margin="0,5,0,0" Padding="5"> 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="Auto" /> 
           <RowDefinition Height="*" /> 
          </Grid.RowDefinitions> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 

          <!-- snipped for brevity --> 

          <ContentPresenter Grid.Row="1" /> 

         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

我修改了ContentPresenter通過以下方式,以便測試出使用 「FindAncestor」 的RelativeSource:

<ContentPresenter Grid.Row="1"> 
    <ContentPresenter.Style> 
     <Style TargetType="{x:Type ContentPresenter}"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="False"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentPresenter.Style> 
</ContentPresenter> 

這工作,但當我將相似的代碼移入代表View的XAML文件時,它不再看到觸發器。例如:

<UserControl ...> 
    <UserControl.Resources> 
     <local:FlowDocumentToXamlConverter x:Key="flowDocumentConverter" /> 
    </UserControl.Resources> 

    <UserControl.Style> 
     <Style TargetType="{x:Type UserControl}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"> 
        <Setter Property="Visibility" Value="Hidden" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Style> 

    <DockPanel Name="SlugContainer"> 
     <Label DockPanel.Dock="Top" Content="Filler" /> 
     <ctrl:BindableRichTextBox x:Name="TextBox" Document="{Binding Content, Converter={StaticResource flowDocumentConverter}, Mode=TwoWay}" LostFocus="OnLostFocus" /> 
    </DockPanel> 
</UserControl> 

如何檢測,最好從視圖的XAML文件,當ListBoxItem已被選中?

謝謝你的幫助!

回答

2

你缺少:

值=您的視圖 「真」

- 會不會是?

+0

這當然可以! =)現在完美。謝謝! – 2011-06-14 14:42:55