Развернуть / Свернуть все расширители - PullRequest
3 голосов
/ 09 ноября 2010

У меня есть список расширителей, которые я хочу контролировать его расширенное состояние (IsExpanded) с помощью глобальной кнопки переключения, которая должна переключаться между развернутым / свернутым состоянием.

Решение, которое я получил до сих пор, заключается в том, чтобы связать состояние IsExpanded экспандера с состоянием 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 ]

7 голосов
/ 25 мая 2011

Я знаю, что этот пост очень старый. Просто опубликовать это для всех, кто сталкивается. Приведенный ниже код работал для меня.

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

Это работает, когда расширители генерируются динамически, например, внутри DataGrid.RowDetailsTemplate.

2 голосов
/ 09 ноября 2010

Я не думаю, что вы можете достичь этого полностью в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...