WPF DataTrigger перестает применять IsExpanded к Expander, если пользователь вручную расширяет

Я хочу, чтобы расширитель расширялся, если установлен флаг в виртуальной машине. Я также хочу, чтобы пользователь мог переопределить это и развернуть/свернуть по своему желанию. Следующий код не работает, срабатывает таймер, и расширитель многократно расширяется и сворачивается, а затем, если вы щелкаете расширитель вручную, он тоже переключается, но триггер не может развернуть или свернуть расширитель. Конечно, как если бы значение, введенное вручную, было установлено и имело бы приоритет над установщиком триггера.

<Expander Header="Test" BorderThickness="2" BorderBrush="Black" VerticalAlignment="Bottom">
  <Expander.Style >
    <Style TargetType="Expander">
       <Setter Property="IsExpanded"  Value="True"></Setter>
       <Style.Triggers>
          <DataTrigger  Binding="{Binding DataContext.AmSet,
              RelativeSource={RelativeSource AncestorType=Grid}}"
                         Value="True">
                <Setter Property="IsExpanded" Value="False"></Setter>
          </DataTrigger>
       </Style.Triggers>
    </Style>
 </Expander.Style>

  <Expander.Content>
            <Border Background="AliceBlue" Width="50" Height="50"></Border>
  </Expander.Content>

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

public class vm : INotifyPropertyChanged
{
    public vm()
    {
        t = new System.Timers.Timer(1000);
        t.Elapsed += t_Elapsed;
        t.Start();
    }
    bool _AmSet = false;
    public bool AmSet
    {
        get { return _AmSet; }
        set
        {
            _AmSet = value;
            OnPropertyChanged("");
        }
    }
    void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        AmSet = !AmSet;
    }
    System.Timers.Timer t;


    private void OnPropertyChanged(string prop)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

person Steve Adams    schedule 12.11.2013    source источник


Ответы (1)


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

<Expander Header="Test" BorderThickness="2" BorderBrush="Black" VerticalAlignment="Bottom" IsExpanded="{Binding AmSet, Mode=TwoWay}"/>

person nmaait    schedule 12.11.2013
comment
Я упростил код, AmSet в моем реальном коде на самом деле является перечислением - я хотел использовать разные значения перечисления для управления автоматическим открытием и закрытием расширителя. Я хотел, чтобы это было в XAML и вне модели представления. Спорно, является ли логическое значение в виртуальной машине, инкапсулирующее ту же функциональность и привязанное к IsExpanded, правильным местом для логики, и то, что вы предлагаете, работает нормально, и, вероятно, это то, что я сделаю, НО я все еще хотел бы знать, почему триггер останавливается работающий ? - person Steve Adams; 13.11.2013