2010-12-23 3 views
1

XML에서 ListBox 메뉴를 생성합니다. 나는 선택과 다른 상태에서 listboxitems의 동작을 스타일 화하기 위해 datatemplate을 사용한다. XML에서 값 'retract'을 얻는 항목 선택시 모든 listbox 항목의 모든 텍스트 블록을 숨길 필요가 있습니다. 이제,이 값을 가지고 있지만 다른 listbox 항목의 텍스트 블록을 숨길 수없는 listboxitem에서만 texblock을 숨길 수 있습니다. 누군가가 도울 수 있는지 궁금합니다. 미리 감사드립니다.동적 목록 상자 메뉴에서 한 항목을 선택하면 모든 목록 상자 항목의 텍스트 표시 여부를 어떻게 제어 할 수 있습니까?

<DataTemplate x:Key="ListBoxItemDataTemplate"> 
     <Grid x:Name="DataItem"> 
      <Image x:Name="IconImage" Source="{Binding [email protected]}" Height="16" Margin="16,0,0,0" Stretch="None" VerticalAlignment="Center" HorizontalAlignment="Left" /> 
      <TextBlock x:Name="ListboxIemtextBlock" Text="{Binding [email protected]}" /> 
      <Image x:Name="ArrowImage" Height="10" Source="Resources/Images/arrow_collapsed_grey.png" Visibility="{Binding [email protected]}"/> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True"> 
       <Setter TargetName="ListboxIemtextBlock" Property="Foreground" Value="White"/> 
       <Setter TargetName="IconImage" Property="Source" Value="{Binding [email protected]}"/> 
       <Setter TargetName="IconImage" Property="Height" Value="16"/> 
       <Setter TargetName="ArrowImage" Property="Source" Value="Resources/Images/arrow_collapsed_white.png"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True"> 
       <Setter TargetName="ListboxIemtextBlock" Property="Foreground" Value="#FF6dacbe"/> 
      </DataTrigger> 
      <MultiDataTrigger>   
       <MultiDataTrigger.Conditions>   
        <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True" />   
        <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="True" />   
       </MultiDataTrigger.Conditions>   
       <Setter TargetName="ListboxIemtextBlock" Property="Foreground" Value="White"/>  
      </MultiDataTrigger> 
      <DataTrigger Binding="{Binding [email protected]}" Value="True" >    
       <Setter TargetName="ListboxIemtextBlock" Property="Visibility" Value="Hidden"/>  
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 

데이터 형식에서 모든 texblocks의 가시성을 제어 할 수없는 것처럼 보입니다. 나는 그것이 ListBox 스타일에서 이루어져야한다고 생각한다. 나는 texblock이 전혀없는 두 번째 datatemplate으로 datatemplates를 전환하려고 생각했습니다. 값이 isSelected이고 XML 바인딩이 Binding = "{XPath = @ retract} 인 조건에 multitrigger를 사용하고 싶었지만 Listbox 스타일의 다중 트리거에 XPath 바인딩을 할당 할 수 없습니다. Perphaps를 올바르게 바인딩하거나 . texblocks을 숨기는 방법에 대한 좋은 아이디어

<Style x:Key="ListBoxItemContainerStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="ContentTemplate" Value="{StaticResource ListBoxItemDataTemplate}"/> 
     <Setter Property="Template" > 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <ContentPresenter x:Name="contentPresenter"/> 
        <ControlTemplate.Triggers>  
         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Property="IsSelected" Value="true"/> 
           <Condition Binding="{[email protected]}" Value="true"/> 
          </MultiTrigger.Conditions> 
          <Setter Property="ContentTemplate" Value="{StaticResource SelectedListBoxItemDataTemplate}"/> 
         </MultiTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

나는 XMLDataProvider와 XML을 채워 나는이 방법으로 XML로 참조합니다.

<XmlDataProvider x:Key="PagesData" XPath="/Pages" Source="Data/DataSource.xml" /> 

XML :

<Pages xmlns=""> 
<page name="Item 1" icon="Resources/Iocn1.png" retract="False" /> 
<page name="Item 2" icon="Resources/Iocn2.png" retract="False" /> 
<page name="Item 3" icon="Resources/Iocn3.png" retract="True" /></Pages> 

답변

2

요 부모 ListBox에 대해 SelectedItem.retract에 바인딩 할 수 있습니다. 이것은 (난 당신의 XML 소스를 가지고 있지 않기 때문에)하지만 당신이 DataTemplate을

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=SelectedItem.retract}" Value="True" > 
    <Setter TargetName="ListboxIemtextBlock" Property="Visibility" Value="Hidden"/> 
</DataTrigger> 
+0

이 트리거를 추가하는 것과 동일한 방법으로

을 작동시킬 수 있어야한다 대신의 XPath의 경로를 사용하여 작업 예이다 내 스레드를 보아 주셔서 감사합니다. XML 샘플을 추가했습니다. 나는 값이 'retract'속성이 'true'일 때 lisboxitem을 선택할 때 세 가지 listboxItems의 모든 texblock을 숨길 수 있어야합니다. 다른 경우에는 아무 것도 변경하지 않아야합니다. 이 datatrigger는 선택된 하나의 listboxitem 만 숨 깁니다. 다른 listbox 항목에서 texblocks를 숨기는 방법에 대한 아이디어가 있다면 궁금합니다. 고맙습니다. – vladc77

+0

@ vladc77, 모든 ListBoxItem이 ListBox의 선택된 항목에서 트리거되기 때문에 ListBoxItems의 모든 TextBlocks를 숨 깁니다. –

+0

방금 ​​테스트 했으므로 선택한 listboxitem에서 texblock 만 숨 깁니다. 나는 이전의 코멘트를 편집했다. 이 데이터 트리거를 'ListBoxItemDataTemplate'datatemplate에 추가했습니다. – vladc77

관련 문제