代码之家  ›  专栏  ›  技术社区  ›  Pradeep

展开/折叠所有展开器

  •  3
  • Pradeep  · 技术社区  · 14 年前

    我有一个扩展器列表,我想用全局切换按钮控制它的扩展状态(isexpanded),该按钮应该在扩展/折叠状态之间切换。

    到目前为止,我得到的解决方案是将扩展程序的IsExpanded状态绑定到ToggleButton的IsChecked状态。只要我不手动切换扩展器,这就可以工作。一旦我这样做,这些特定的扩展器就不尊重绑定(切换按钮的ischecked状态)。

    知道为什么吗?在XAML中有没有一个干净的解决方案?

    <Page
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Grid>  
      <StackPanel>
        <ToggleButton Name="ExpandAll">Toggle</ToggleButton>  
        <Expander IsExpanded="{Binding ElementName=ExpandAll,Path=IsChecked, Mode=OneWay}">
          Hai
        </Expander>
        <Expander IsExpanded="{Binding ElementName=ExpandAll,Path=IsChecked, Mode=OneWay}">
          Hello
        </Expander>
        <Expander IsExpanded="{Binding ElementName=ExpandAll,Path=IsChecked, Mode=OneWay}">
          Weird
        </Expander>
        </StackPanel>
      </Grid>
    </Page>
    
    2 回复  |  直到 12 年前
        1
  •  2
  •   Steve Greatrex    14 年前

    我觉得你做不到 完全 在XAML中,但下面允许您使用 IValueConverter :

    <StackPanel>
            <StackPanel.Resources>
                <local:Converter x:Key="Converter" />
            </StackPanel.Resources>
            <ToggleButton Name="ExpandAll">
                <ToggleButton.IsChecked>
                    <MultiBinding Mode="OneWayToSource" Converter="{StaticResource Converter}">
                        <Binding ElementName="Expander1" Path="IsExpanded" />
                        <Binding ElementName="Expander2" Path="IsExpanded" />
                        <Binding ElementName="Expander3" Path="IsExpanded" />
                    </MultiBinding>
                </ToggleButton.IsChecked>
                Toggle</ToggleButton>
            <Expander Name="Expander1">
                Hai
            </Expander>
            <Expander Name="Expander2">
                Hello
            </Expander>
            <Expander Name="Expander3">
                Weird
            </Expander>
        </StackPanel>
    

    还有你的 Converter 如下所示:

    public class Converter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            //we're using OneWayToSource, so this will never be used.
            return DependencyProperty.UnsetValue;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            // we want to convert the single 'IsChecked' value from the ToggleButton into 
            // 3 'IsExpanded' values
            var allValues = new object[targetTypes.Length];
            for (int i = 0; i < allValues.Length; i++)
            {
                allValues[i] = value;
            }
    
            return allValues;
        }
    }
    

    这是通过设置 OneWayToSource IsChecked 的属性 ToggleButton (即约束将 设置 当目标值更改时对源),并使用 IMultiValueConverter 将单个值转换为每个 Expander S.

        2
  •  7
  •   Simon    14 年前

    我知道这篇文章很老。把这个贴给其他遇到的人。下面的代码对我有用。

    <Expander IsExpanded="{Binding ElementName=ExpandAll, Path=IsChecked, UpdateSourceTrigger=Explicit}">
    </Expander>
    

    当动态生成扩展器时,例如在 DataGrid.RowDetailsTemplate .

    推荐文章