【问题标题】:Hide checkbox, but show its content隐藏复选框,但显示其内容
【发布时间】:2016-01-07 07:31:34
【问题描述】:

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

<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),但文本应该保持可见。

【问题讨论】:

    标签: c# wpf xaml checkbox listbox


    【解决方案1】:

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

    1. 每个项目都有一个复选框和文本块 - 您可能会遇到边距等问题
    2. 没有内容的复选框(仅在编辑模式下可见)和始终可见的文本块
    3. 取复选框的默认控件模板(Default ControlTemplate for CheckBox)并绑定复选框的可见性

    【讨论】:

      【解决方案2】:

      为此,您可以保留两个 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;
      }
      

      【讨论】:

      • Mukesh Kumar,谢谢,但这会导致错误“对象 'DataTemplate' 已经有一个孩子,无法添加 'TextBlock'。'DataTemplate' 只能接受一个孩子。”
      • 一个数据模板确实只能有一个孩子。为了解决这个问题,将复选框和文本块包装在水平堆栈面板中
      • @Dzhara,我只是想给你一个想法。现在我更新了代码。请看一下,如果有帮助,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2011-04-21
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多