展开/折叠所有展开器

时间:2010-11-09 10:42:20

标签: wpf xaml

我有一个扩展器列表,我希望用全局切换按钮控制其扩展状态(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 个答案:

答案 0 :(得分:7)

我知道这篇文章很老了。只需将其发布给遇到的其他人。以下代码对我有用。

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

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

,这是有效的

答案 1 :(得分:2)

我认为您无法在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的{​​{1}}属性之间设置IsChecked绑定来实现(即当目标绑定时<绑定将设置与源相对应)价值变化),并使用ToggleButton将每个IMultiValueConverter的单个值转换为一个。