首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制在动态列表框菜单中选择某一项时所有列表项中文本的可见性?

如何控制在动态列表框菜单中选择某一项时所有列表项中文本的可见性?
EN

Stack Overflow用户
提问于 2010-12-23 17:25:23
回答 1查看 1.2K关注 0票数 1

我从XML生成ListBox菜单。我使用数据模板来样式化列表框项目在选择和其他状态下的行为。我需要隐藏所有列表框项目中的所有文本块在选择项目时,从XML获取一个值‘retract’。现在,我只能在具有该值的listboxitem中隐藏文本块,但不能隐藏其他listboxitem中的文本块。我想知道是否有人能帮上忙。提前谢谢你。

代码语言:javascript
复制
<DataTemplate x:Key="ListBoxItemDataTemplate">
        <Grid x:Name="DataItem">
            <Image x:Name="IconImage" Source="{Binding XPath=@icon}" Height="16" Margin="16,0,0,0" Stretch="None" VerticalAlignment="Center" HorizontalAlignment="Left" />
            <TextBlock x:Name="ListboxIemtextBlock" Text="{Binding XPath=@name}" />
            <Image x:Name="ArrowImage" Height="10" Source="Resources/Images/arrow_collapsed_grey.png" Visibility="{Binding XPath=@state}"/>
        </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 XPath=@iconSelected}"/>
                <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 XPath=@retract}" Value="True" >             
                <Setter TargetName="ListboxIemtextBlock" Property="Visibility" Value="Hidden"/>      
            </DataTrigger> 
         </DataTemplate.Triggers>
    </DataTemplate>

看起来我不能控制一个数据模板中所有文本块的可见性。我认为应该以ListBox风格来完成。我在考虑用另一个完全没有文本块的数据模板来交换数据模板。我想对Binding="{XPath=@retract}“的值为isSelected和XML-Binding的条件使用多触发器。但是,我不能在列表框样式中为多触发器分配XPath绑定。也许,您可以帮助正确绑定它,或者对如何隐藏文本块有更好的想法。

代码语言:javascript
复制
<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="{XPath=@retract}" Value="true"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="ContentTemplate" Value="{StaticResource SelectedListBoxItemDataTemplate}"/> 
                        </MultiTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>  
    </Style> 

我用XMLDataProvider填充了XML。我是这样引用xml的:

代码语言:javascript
复制
<XmlDataProvider x:Key="PagesData" XPath="/Pages" Source="Data/DataSource.xml" />

XML:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-23 22:09:38

您可以绑定到父ListBox的SelectedItem.retract。这是一个使用Path而不是XPath的工作示例(因为我没有您的XML源),但是您应该能够让它以相同的方式工作

在DataTemplate中添加此触发器

代码语言:javascript
复制
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Path=SelectedItem.retract}" Value="True" >
    <Setter TargetName="ListboxIemtextBlock" Property="Visibility" Value="Hidden"/>
</DataTrigger>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4517387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档