2013-11-12 2 views
1

Я хочу, чтобы расширитель расширялся, если установлен флаг в виртуальной машине. Я также хочу, чтобы пользователь мог переопределить это и развернуть/свернуть по желанию. Следующий код не работает, таймер запускается, и расширитель расширяется и сжимается многократно - тогда, если вы щелкаете экспандером вручную, он тоже заворачивается - но триггер не может развернуть или свернуть расширитель. Разумеется, как будто значение, введенное вручную, установлено и имеет приоритет над сетью триггеров.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; 
} 

ответ

0

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

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

+0

я упростил код, AmSet в моем реальном коде на самом деле это перечисление - я хотел использовать различающиеся значения перечислений для управления, когда расширитель открывается и закрывается автоматически. Я хотел, чтобы это было в XAML и вне модели просмотра. Его аргумент в том, является ли логическое значение в виртуальной машине, инкапсулирующее ту же функциональность и связанную с IsExpanded, правильным местом для логики, и это то, что вы предлагаете, прекрасно работает и, вероятно, я буду делать, но мне все равно хотелось бы знать, почему триггер останавливается за работой ? –