Wpf 将复选框用作扩展器中的切换按钮
我是wpf的新手,必须解决以下问题 我需要创建一个列表(我正在使用一个列表框)的项目,可以扩展(扩展器)。 问题是,只有当它们被“选中”时,它们才能被扩展。 每个listboxitem都应该有一个复选框和一些文本 下面是一个基本的例子来说明我的意思:Wpf 将复选框用作扩展器中的切换按钮,wpf,checkbox,expander,togglebutton,Wpf,Checkbox,Expander,Togglebutton,我是wpf的新手,必须解决以下问题 我需要创建一个列表(我正在使用一个列表框)的项目,可以扩展(扩展器)。 问题是,只有当它们被“选中”时,它们才能被扩展。 每个listboxitem都应该有一个复选框和一些文本 下面是一个基本的例子来说明我的意思: <listbox> <item>(checkbox) John Doe</item> <item>(checkbox) Mike Murray</item> </listbox>
<listbox>
<item>(checkbox) John Doe</item>
<item>(checkbox) Mike Murray</item>
</listbox>
(复选框)无名氏
(复选框)迈克·默里
如果选中列表框中的任何复选框(允许多个),则
项目展开,显示更多数据
再举一个例子:
<listbox>
<item>
(checkbox-checked) John Doe
Some extra data shown in expanded area
</item>
<item>
(checkbox-unchecked) Mike Murray</item>
</listbox>
(选中复选框)John Doe
一些额外的数据显示在扩展区域中
(复选框未选中)迈克·默里
我无法让扩展器使用复选框作为“切换按钮”
有人能帮我吗?非常欢迎使用一些示例代码…这应该可以做到:
<ListBox>
<ListBox.Resources>
<Style TargetType="Expander">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Expander">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<CheckBox
IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
Content="{TemplateBinding Header}"
/>
<ContentControl
x:Name="body"
Grid.Row="1" Content="{TemplateBinding Content}"
/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="body" Property="Visibility" Value="Collapsed" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
<Expander Header="One">
Content one
</Expander>
<Expander Header="Two">
Content two
</Expander>
</ListBox>
内容一
内容二
我在这里定义了一个样式
,用于更改应用样式
的任何扩展器
控件的模板。(由于我已将样式
放在列表框中。参考资料
它将自动应用于列表中的扩展器
控件。)
使复选框
起作用的诀窍是,当您将它(或者任何基于的切换按钮
控件)放入扩展器
模板时,您需要使用一个配置了相对资源
的数据绑定,并将其设置为模板属性
。这将启用双向绑定-这意味着复选框不仅反映了扩展器的当前状态,还可以更改当前状态。在标题中添加复选框所需的全部代码如下:
<telerik:RadExpander.Header>
<StackPanel Orientation="Horizontal">
<CheckBox VerticalAlignment="Center"/>
<TextBlock Margin="5,0,0,0">Legend</TextBlock>
</StackPanel>
</telerik:RadExpander.Header>
传奇
我使用的是Rad控制,同样可以使用标准扩展器来实现Hi-Ian,非常感谢您的回复。在我的应用程序中,您的示例和它(在某种程度上)都有效。我还有一个问题,希望你也能帮忙。给定原始问题的设置,一个带有复选框作为切换按钮的列表框,我使用它来显示客户列表。我的下一个问题是:一些客户需要预先选择(例如:如果客户年龄>18岁,则在加载表单时默认=选中),我可以这样做吗(是否可以通过绑定?)是的,绝对可能。我假设您实际使用的是ItemTemplate,并且扩展器在其中。(如果不是,您应该!)在ViewModel中,您需要一个每项ViewModel类,这样您的主ViewModel就可以公开一个列表,并将其作为列表的项源。然后,只需将扩展器的IsExpanded属性绑定到每项viewmodel的布尔属性即可。我还没有针对列表框中的项的每项viemodel类,我将尝试这样做。我现在要做的是将扩展器的IsExpanded属性与当前表单/视图的viewmodel中的属性绑定,但不知何故,我无法访问/找到该属性。当我写:IsExpanded=“True”时,它工作得非常完美。当我写入IsExpanded=“{Binding Path=propertyNamesatGivesBooleanForSelected}”(或不带Path=)时,它不起作用。该属性永远不会被读取。我会像你说的那样尝试一个每个项目的视图模型,但我真的希望我现在所做的也能工作。我刚刚像你说的那样创建了一个每个项目的视图模型,现在它工作得很完美!非常感谢你的帮助!