Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果用户手动展开,WPF DataTrigger将停止将IsExpanded应用于扩展器_Wpf_Triggers_Datatrigger_Expander - Fatal编程技术网

如果用户手动展开,WPF DataTrigger将停止将IsExpanded应用于扩展器

如果用户手动展开,WPF DataTrigger将停止将IsExpanded应用于扩展器,wpf,triggers,datatrigger,expander,Wpf,Triggers,Datatrigger,Expander,如果VM中设置了标志,我希望扩展器进行扩展。我还希望用户能够覆盖此选项并随意展开/折叠。以下代码不起作用,计时器启动,扩展器反复展开和折叠-然后如果手动单击扩展器,它也会切换-但触发器无法展开或折叠扩展器。当然,这就好像设置了手动键控值,并且优先于触发器设置器 <Expander Header="Test" BorderThickness="2" BorderBrush="Black" VerticalAlignment="Bottom"> <Expander.Style

如果VM中设置了标志,我希望扩展器进行扩展。我还希望用户能够覆盖此选项并随意展开/折叠。以下代码不起作用,计时器启动,扩展器反复展开和折叠-然后如果手动单击扩展器,它也会切换-但触发器无法展开或折叠扩展器。当然,这就好像设置了手动键控值,并且优先于触发器设置器

<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>

您需要使用DataTrigger执行此操作有什么原因吗?它可以通过双向绑定轻松实现


我简化了代码,实际代码中的AmSet实际上是一个枚举-我想使用不同的枚举值来控制扩展器何时自动打开和关闭。我希望这是在XAML和关闭视图模型。在虚拟机中封装相同功能并绑定到IsExpanded的布尔值是否适合逻辑,这是有争议的,并且您建议的效果很好,这可能是我将要做的,但我仍然想知道为什么触发器停止工作?
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;
}