WPF Expander игнорирует привязку данных после взаимодействия с пользователем - PullRequest
0 голосов
/ 30 августа 2018

У меня есть приложение WPF с расширителем, в котором я хочу изменить свойство IsExpanded на основе значения enum в моей модели представления, т.е. я хочу, чтобы расширитель открывался или закрывался на основе это свойство перечисления. Я использую триггеры данных в xaml для обновления свойства IsExpanded на основе на стоимость моего свойства enum backing.

<Expander Header="Information and Procedures"
                              BorderThickness="0"
                              Margin="5">
                        <Expander.Style>
                            <Style TargetType="{x:Type Expander}" BasedOn="{StaticResource MetroExpander}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding DataContext.Item.Match, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=TwoWay}" 
                                                 Value="{x:Static enum:Match.Multiple}">
                                        <Setter Property="IsExpanded" Value="False"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding DataContext.Item.Match, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=TwoWay}" 
                                                 Value="{x:Static enum:Match.None}">
                                        <Setter Property="IsExpanded" Value="True"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding DataContext.Item.Match, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=TwoWay}" 
                                                 Value="{x:Static enum:Match.Exact}">
                                        <Setter Property="IsExpanded" Value="True"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Expander.Style>
                        <WrapPanel Orientation="Horizontal" Background="Transparent">
                            <view:InformationView Margin="0 0 20 0"/>
                            <view:ProceduresView Margin="0 0 0 0" />
                        </WrapPanel>
                     </Expander>

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

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

Примечание. Я не хочу, чтобы значение Match изменялось свойством IsExpanded. Соответствие обновляется отдельно, но его значение влияет на IsExpanded

1 Ответ

0 голосов
/ 30 августа 2018

Это связано с тем, что привязка находится на DataTrigger, а не на свойстве IsExpanded, поэтому изменение IsExpanded никак не влияет на свойство DataTrigger bound.

Привязать к свойству IsExpanded и использовать пользовательский IValueConverter для перевода в обоих направлениях между исходным перечислением и расширением bool.

См .: https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.data.ivalueconverter

В качестве приятного побочного эффекта вы также получите более короткий и удобный для чтения XAML.

UPDATE

Чтобы добиться желаемого поведения, в логической модели для расширенного состояния задайте логическое свойство, которое в двух направлениях связано со свойством IsExpanded Expander, и измените его в модели представления, когда свойство Match изменения. Таким образом, и пользователь, и модель представления могут изменять состояние Expander.

Что-то вроде:

public bool IsExpanded
{
    get => _isExpanded;
    set
    {
        _isExpanded = value;
        OnPropertyChanged(nameof(IsExpanded));
    }
}

public Match Match
{
    get => _match;
    set
    {
       _match = value;
       switch (value)
       {
           case Exact:
           case None:
               IsExpanded = true;
               break;
           case Multiple:
               IsExpanded = false;
               break;
       }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...