Sankar M
Sankar M

Reputation: 4809

WPF | Expander Event

In my console I'm using two Expanders say(x & y)

by default it has been set 'IsExpanded = False'

once I click x then y should not be Expanded vice-versa

so please reply me with a code

Upvotes: 2

Views: 4739

Answers (3)

MikeT
MikeT

Reputation: 5500

I would just Bind the IsExpanded property of one expander to the IsExpanded property on the other, then you just need to supply a value converter that inverts the value

public class BoolInverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var b = value as bool?;
        return !b;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var b = value as bool?;
        return !b;
    }
}

Upvotes: 0

André
André

Reputation: 1

This may help: Just register the expanded event for all your expander items (all the same event). If you open one, all others are closed:

    private void expander_Expanded(object sender, RoutedEventArgs e)
    {
        SPExpander.Children.OfType<Expander>()
            .All<Expander>(expander =>
            {
                if ((Expander)sender != expander)
                    expander.IsExpanded = false;
                else
                    expander.IsExpanded = true;

                return true;
            });
    }

Hope this solve you problem...

Upvotes: 0

Felice Pollano
Felice Pollano

Reputation: 33272

Even if it is possible doing it in plain markup, it would probably better to use an attached behavior. Here an example:

class Toggle
    {
        Expander target;
        public Toggle(Expander src,Expander target)
        {
            this.target = target;
            src.Collapsed += new RoutedEventHandler(src_Collapsed);
            src.Expanded += new RoutedEventHandler(src_Expanded);
        }

        void src_Expanded(object sender, RoutedEventArgs e)
        {
            target.IsExpanded = false;
        }

        void src_Collapsed(object sender, RoutedEventArgs e)
        {
            target.IsExpanded = true;
        }
    }
    public static class ToggleExpanderBehavior
    {

        static List<Toggle> toggler = new List<Toggle>();
        public static Expander GetTargetExpander(DependencyObject obj)
        {
            return (Expander)obj.GetValue(TargetExpanderProperty);
        }

        public static void SetTargetExpander(DependencyObject obj, string value)
        {
            obj.SetValue(TargetExpanderProperty, value);
        }

        // Using a DependencyProperty as the backing store for TargetName.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TargetExpanderProperty =
            DependencyProperty.RegisterAttached("TargetExpander", typeof(Expander), typeof(ToggleExpanderBehavior), new UIPropertyMetadata(null,new PropertyChangedCallback(OnTargetChanged)));

        static void OnTargetChanged(DependencyObject depo, DependencyPropertyChangedEventArgs depa)
        {
            if (depa.NewValue!=null)
            {
                if (depo is Expander)
                {
                    var exp = depo as Expander;
                    toggler.Add(new Toggle(exp,depa.NewValue as Expander));
                }
            }
        }




    }

You van attach this behavior in xaml like this:

 <Expander x:Name="X" IsExpanded="True" local:ToggleExpanderBehavior.TargetExpander="{Binding ElementName=Y}" >
            <TextBlock>Content 1</TextBlock>
        </Expander>
        <Expander x:Name="Y" IsExpanded="False"  local:ToggleExpanderBehavior.TargetExpander="{Binding ElementName=X}">

            <TextBlock>Content 2</TextBlock>
        </Expander>
    </StackPanel>

and you have the toggle on.

Upvotes: 1

Related Questions