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