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