Wpf 如果一个扩展器展开,则多个扩展器必须折叠

Wpf 如果一个扩展器展开,则多个扩展器必须折叠,wpf,collapse,expander,Wpf,Collapse,Expander,有4个扩展器控制器。当一个扩展器展开时,如何使所有其他扩展器折叠/关闭?使用MVVM并将IsExpanded属性绑定到视图模型上的布尔标志。当其中一个更新为true时,将所有其他设置为false尝试以下代码: XAML: 视图模型: 初始化 说明: 在XAML中,我们有4个扩展器。它们都从containerStackPanel通过DataContext继承ViewModel(类型为ExpanderListViewModel) 它们都绑定到ViewModel类上的单个属性。并使用绑定中的Conv

有4个扩展器控制器。当一个扩展器展开时,如何使所有其他扩展器折叠/关闭?

使用MVVM并将IsExpanded属性绑定到视图模型上的布尔标志。当其中一个更新为
true
时,将所有其他设置为
false

尝试以下代码:

XAML: 视图模型: 初始化
说明: 在XAML中,我们有4个扩展器。它们都从container
StackPanel
通过
DataContext
继承
ViewModel
(类型为
ExpanderListViewModel

它们都绑定到
ViewModel
类上的单个属性。并使用绑定中的
ConverterParameter
为自己定义了唯一的索引。每当您展开扩展器时,该索引将保存在
SelectedExpander
属性中。如果存储的索引与给定索引匹配,
转换器使用该索引返回
true
,如果存储的索引不匹配,则返回
false


Converter
类的
Convert
ConvertBack
方法中放置一个断点,您将看到发生了什么。

示例代码:

<my:Accordion  x:Name="accordion1" VerticalAlignment="Top" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" SelectionMode="ZeroOrOne">
        <my:AccordionItem Header="First Header" Content="First Content"/>
        <my:AccordionItem Header="Second Header">
            <StackPanel Height="300">
            <TextBlock Text="Second Content" /></StackPanel>
        </my:AccordionItem>
        <my:AccordionItem>
            <my:AccordionItem.Header>
                <TextBox Text="Third Item" />
            </my:AccordionItem.Header>
            <StackPanel Height="300">
                <TextBlock Text="Third Item" />
            </StackPanel>
        </my:AccordionItem>
        <my:AccordionItem>
            <my:AccordionItem.Header>
                <TextBlock Text="Fourth Item" />
            </my:AccordionItem.Header>
            <StackPanel Height="300">
                <TextBlock Text="Third Item" />
            </StackPanel>
        </my:AccordionItem>
    </my:Accordion>

仅设置失去焦点似乎是最简单的方法

Xaml:


我也需要这个,但所有的答案在我看来都太多了。 我是这样做的:

  • 添加了StackPanel(子对齐设置为垂直)
  • 增加了3个扩展器。(3)
  • 将扩展器的高度设置为120px以向其添加元素
  • 每个扩展器称为ex1..3
  • 每个人有2个项目

    private void ex1_Collapsed(object sender, RoutedEventArgs e)  
    {  
        ex1.Height = 23.0;  
    }  
    
    private void ex1_Expanded(object sender, RoutedEventArgs e)    
    {  
        ex1.Height = 120.0;  
        ex2.IsExpanded = false;  
        ex3.IsExpanded = false;  
    }  
    
  • 在窗口加载时,将所有应折叠高度的扩展器重置为23px
  • 就是这样。

    我就是这样做的:

    1) 添加了StackPanel,并且必须添加名称标签属性(因为这是主标签)

    StackPanel Name=“StackPanel1”

    2) 根据需要添加尽可能多的扩展器(如果需要,1到100个扩展器),每个扩展器必须具有:-

    Expanded=“Expander\u Expanded”

    添加(注意,所有文字都100%相同)

    3) 无需在每个细节上匹配其他细节(无需身高名称等)

    Xaml:

    5) 现在您可以更改/添加内容、按钮、文本框等。。您只需在不更新代码的情况下更改2件事1、“StackPanel名称”2、“Expander Expanded”,否则将无法工作

    希望这些信息对您有所帮助

    发生了什么事

    1) 所有面板都是父面板,该面板上的所有控件都是子面板

    2) 所有控件都是父面板的子级

    3) 一个类一次处理一个调用

    4) 这门课是关于儿童的

    6) 全班转到下一个孩子

    7) 询问所有孩子后停止

    所以伪代码是这样的:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (string)value == (string)parameter;
    }
    
    1) 听一个孩子的名字叫x

    2) 询问家长名单中的每个孩子

    3) 如果孩子没有打电话,那么

    4) 子项扩展为false

    5) 别再问那个孩子了

    6) 移动到下一个孩子并再次询问


    7) 在所有孩子都被问到之前,wassim azirar被问到接受的答案:


    如何在应用程序启动时展开“扩展器1”

    我在ViewModel中添加了:

    SelectedExpander = "1";
    
    因为事实上,“1”与XAML中的“1”不是同一个对象,所以这不起作用,所以我改变了decyclone的答案如下:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (string)value == (string)parameter;
    }
    
    除旋流器的回答对我很有帮助-谢谢。

    因此,如果有人需要,我想与大家分享我的经验。

    控制逻辑应该在viewmodel中吗?除了控制视图,视图模型还有什么其他用途?只要您可以在不需要实例化任何视图对象的情况下实例化和测试视图模型,我就称解耦是成功的。@Lisa:如果您说的是
    Silverlight Toolkit
    ,它将正式成为
    未来Silverlight
    的一部分。它由微软
    Microsoft
    的家伙维护,添加到它的控件将添加到未来版本的
    Silverlight
    。所以,没有理由不使用它。我发现这个解决方案非常有用。ThanksHow我可以在应用程序启动时展开“Expander 1”吗?调试时,我注意到当我为所有扩展器放置相同的
    ConverterParameter
    时,我仍然可以工作(一次只打开一个扩展器)。然而,当我扩展一个时,它不应该扩展所有的吗?在转换器的
    Convert
    方法中放置断点后,表达式
    value==参数
    似乎始终为false,即使保持相同的值。。。对此有什么解释呢?经过一点研究,我发现当用
    =
    操作符比较对象时,它实际上比较的是引用,而不是对象的内容。因此,为了使代码按预期工作,您应该在比较之前将
    参数
    转换为整数。同样地,
    Convert
    方法的返回语句应该是
    return(System.Convert.ToInt32(value)==System.Convert.ToInt32(参数))此组件非常糟糕,有几个bug、缺陷和问题。是否有其他人提出了相同的操作?该解决方案的缺点是,当您单击用户控件/窗口中的任何其他位置时,扩展器也会失去焦点并折叠扩展器。您可能需要解释是什么使此答案正确。
    
    <Expander LostFocus="CollapseExpander" ExpandDirection="Down" Width="175">
        <ListBox Height="265" Margin="0,5,0,10">
        </ListBox>
    </Expander>
    
    Private Sub CollapseExpander(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    
     sender.IsExpanded = False
    
    End Sub
    
    private void ex1_Collapsed(object sender, RoutedEventArgs e)  
    {  
        ex1.Height = 23.0;  
    }  
    
    private void ex1_Expanded(object sender, RoutedEventArgs e)    
    {  
        ex1.Height = 120.0;  
        ex2.IsExpanded = false;  
        ex3.IsExpanded = false;  
    }  
    
    <StackPanel Name="StackPanel1">
    <Expander Header="Expander 1" Expanded="Expander_Expanded">
        <TextBlock>Expander 1</TextBlock>
    </Expander>
    <Expander Header="Expander 2" Expanded="Expander_Expanded">
        <TextBlock>Expander 2</TextBlock>
    </Expander>
    <Expander Header="Expander 3" Expanded="Expander_Expanded" >
        <TextBlock>Expander 3</TextBlock>
    </Expander>
    <Expander Header="Expander 4" Expanded="Expander_Expanded" >
        <TextBlock>Expander 4</TextBlock>
    </Expander>
    
    Private Sub Expander_Expanded(sender As Object, e As RoutedEventArgs)
        For Each exp As Expander In StackPanel1.Children
            If exp IsNot sender Then
                exp.IsExpanded = False
            End If
        Next
    End Sub
    
    SelectedExpander = "1";
    
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (string)value == (string)parameter;
    }