隐藏复选框,但显示其内容

本文关键字:显示 复选框 隐藏 | 更新日期: 2023-09-27 18:16:59

是否可以隐藏复选框,但保留其内容可见?

<ListBox  
         ItemsSource ="{Binding MyItemCollection}"     
         SelectionMode="Single" 
         Width="300"
         Height="320">
      <ListBox.ItemTemplate>
          <DataTemplate>
             <CheckBox IsChecked="{Binding IsChecked}">
                   <CheckBox.Content>
                       <TextBlock Text="{Binding Item.Code}"/>
                   </CheckBox.Content>
             </CheckBox>
          </DataTemplate>
      </ListBox.ItemTemplate>
</ListBox>
<StackPanel>
   <CheckBox Content="Edit Mode" 
             IsChecked="{Binding Path=EditModeSelected, Mode=TwoWay}">
   </CheckBox>
</StackPanel>

当我关闭编辑模式时,我想隐藏列表框中的复选框(所以它应该绑定到EditModeSelected),但是文本应该是可见的。

隐藏复选框,但显示其内容

为了做到这一点,你可以保留两个textblock。在编辑模式下可见CheckBox和隐藏TextBlock,在阅读器模式下反之亦然。我希望这能有所帮助。因为DataTemplate只能有一个子节点

创建如下所示的窗口资源。创建了两个数据模板,一个用于编辑模式,另一个用于阅读器模式。

<Window.Resources>
    <DataTemplate x:Key="EditModeTemplate">
        <CheckBox IsChecked="{Binding IsChecked}">
            <CheckBox.Content>
                <TextBlock Text="{Binding Item.Code}"/>
            </CheckBox.Content>
        </CheckBox>
    </DataTemplate>
    <DataTemplate x:Key="ReaderModeTemplate">
        <TextBlock Text="{Binding Item.Code}"/>
    </DataTemplate>
</Window.Resources>

现在在。cs文件中按要求分配日期模板。

if (EditMode)
{
    DemoCollection.ItemTemplate = this.Resources["EditModeTemplate"] as DataTemplate;
}
else
{
    DemoCollection.ItemTemplate = this.Resources["ReaderModeTemplate"] as DataTemplate;
}

我想到了3种可能的解决方案-其中两种或多或少是"黑客",另一种或多或少是干净的解决方案:

  1. 每个项目都有一个复选框和文本块-你可能会遇到边距等问题
  2. 一个没有内容的复选框(只有在编辑模式下才可见)和一个始终可见的文本块
  3. 采用checkbox的默认控制模板(default controltemplate for checkbox)并绑定复选框的可见性

这是一个Xaml唯一的解决方案,从一个项目我正在工作。在本例中,ShowCheck"是当前绑定上下文中的一个字段,表示是否显示检查。

<CheckBox Content="{Binding Name}">
    <CheckBox.Style>
        <Style TargetType="CheckBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ShowCheck}" Value="False">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="CheckBox">
                                <ContentControl Content="{TemplateBinding Content}"/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>

基本上,如果复选框应该是不可见的,那么我使用样式和触发器将复选框的模板更改为没有复选框的东西。我的实现内容只是一个字符串,所以这是可行的。如果要将更复杂的对象放入复选框中,则可能需要将ContentTemplate、ContentTemplateSelector和相关字段放入用于替换复选框

的ContentControl中。