隐藏复选框,但显示其内容
本文关键字:显示 复选框 隐藏 | 更新日期: 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种可能的解决方案-其中两种或多或少是"黑客",另一种或多或少是干净的解决方案:
- 每个项目都有一个复选框和文本块-你可能会遇到边距等问题
- 一个没有内容的复选框(只有在编辑模式下才可见)和一个始终可见的文本块
- 采用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和相关字段放入用于替换复选框