Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 将复选框用作扩展器中的切换按钮_Wpf_Checkbox_Expander_Togglebutton - Fatal编程技术网

Wpf 将复选框用作扩展器中的切换按钮

Wpf 将复选框用作扩展器中的切换按钮,wpf,checkbox,expander,togglebutton,Wpf,Checkbox,Expander,Togglebutton,我是wpf的新手,必须解决以下问题 我需要创建一个列表(我正在使用一个列表框)的项目,可以扩展(扩展器)。 问题是,只有当它们被“选中”时,它们才能被扩展。 每个listboxitem都应该有一个复选框和一些文本 下面是一个基本的例子来说明我的意思: <listbox> <item>(checkbox) John Doe</item> <item>(checkbox) Mike Murray</item> </listbox>

我是wpf的新手,必须解决以下问题

我需要创建一个列表(我正在使用一个列表框)的项目,可以扩展(扩展器)。 问题是,只有当它们被“选中”时,它们才能被扩展。 每个listboxitem都应该有一个复选框和一些文本

下面是一个基本的例子来说明我的意思:

<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=)时,它不起作用。该属性永远不会被读取。我会像你说的那样尝试一个每个项目的视图模型,但我真的希望我现在所做的也能工作。我刚刚像你说的那样创建了一个每个项目的视图模型,现在它工作得很完美!非常感谢你的帮助!