Как вызвать свойство IsExpanded экспандера WPF из свойства IsExpanded другого экспандера - PullRequest
2 голосов
/ 06 октября 2010

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

Как видно из кода, я включил свойство «Заголовок» в качестве теста, и оно работает как положено, но свойство IsExpanded не работает.

<Expander x:Name="emailExpander">
  <Expander.Style>
    <Style TargetType="Expander">
      <Setter Property="IsExpanded" Value="False"/>
      <Setter Property="Header" Value="Email"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding IsExpanded,ElementName=customerExpander}" Value="True">
          <Setter Property="IsExpanded" Value="False"/>
          <Setter Property="Header" Value="other expanded"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Expander.Style>      
</Expander>

Ответы [ 3 ]

1 голос
/ 01 апреля 2015

Это может быть обработано путем привязки к объекту представления с небольшой добавленной логикой.

В вашем WPF свяжите свойство IsExpanded со свойствами EmailExpanded и CustomerExpanded представления.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>
    <Expander Grid.Column="0" Header="Email" IsExpanded="{Binding EmailExpanded}">
        <TextBlock Text="Email Data"/>
    </Expander>
    <Expander Grid.Column="1" Header="Customer" IsExpanded="{Binding CustomerExpanded}">
        <TextBlock Text="Customer Data"/>
    </Expander>
</Grid>

Назначьте вид в главном окне.

public MainWindow()
{
    InitializeComponent();

    DataContext = new View();
}

Затем сделайте ваш класс вида примерно таким:

class View : INotifyPropertyChanged
{
    private bool _CustomerExpanded;
    public bool CustomerExpanded
    {
        get
        {
            return _CustomerExpanded;
        }
        set
        {
            if (_CustomerExpanded != value)
            {
                // Add logic to close Email Expander
                if (value)
                {
                    EmailExpanded = false;
                }

                _CustomerExpanded = value;
                OnPropertyChanged("CustomerExpanded");
            }
        }
    }

    private bool _EmailExpanded;
    public bool EmailExpanded
    {
        get
        {
            return _EmailExpanded;
        }
        set
        {
            if (_EmailExpanded != value)
            {
                // Add logic to close Customer Expander
                if (value)
                {
                    CustomerExpanded = false;
                }

                _EmailExpanded = value;
                OnPropertyChanged("EmailExpanded");
            }
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

Обратите внимание на дополнение к сеттерам. Свертывание экспандера не повлияет на другой экспандер, но расширение одного приведет к разрушению другого. Нет переполнения стека:)

0 голосов
/ 06 октября 2010

Лучше всего использовать элемент управления аккордеоном, выпущенный в WPF Toolkit V2 . Очень удобно и без исключений "переполнение стека". =)

0 голосов
/ 06 октября 2010

Я нашел ответ в этом посте: Триггеры WPF Expanders

Используйте BoolInverterConverter в ответе выше, и вот фрагменты кода для вашего случая

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:BoolInverterConverter x:Key="bic"/>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Expander x:Name="emailExpander" IsExpanded="{Binding ElementName=customerExpander, Converter={StaticResource bic}, Path=IsExpanded}">
        <Expander.Style>
            <Style TargetType="Expander">
                <Setter Property="Header" Value="Email"/>
            </Style>
        </Expander.Style>
        <StackPanel Margin="10,4,0,0">
            <CheckBox Margin="4" Content="Email 1" />
            <CheckBox Margin="4" Content="Email 2" />
            <CheckBox Margin="4" Content="Email 3" />
        </StackPanel>
    </Expander>
    <Expander x:Name="customerExpander" Grid.Column="1"> 
        <Expander.Style>
            <Style TargetType="Expander">
                <Setter Property="Header" Value="Customer"/>
            </Style>
        </Expander.Style>
        <StackPanel Margin="10,4,0,0">
            <CheckBox Margin="4" Content="Customer 1" />
            <CheckBox Margin="4" Content="Customer 2" />
            <CheckBox Margin="4" Content="Customer 3" />
        </StackPanel>
    </Expander>
</Grid>

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