以编程方式执行一个EventTrigger

本文关键字:一个 EventTrigger 编程 方式 执行 | 更新日期: 2023-09-27 18:08:06

我在Silverlight中定义了一个控件,如下所示:

<HyperlinkButton x:Name="testHyperlink" Content="Test" FontWeight="Bold" Click="testHyperlink_Click">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <ei:ChangePropertyAction PropertyName="Visibility" TargetName="panel1"   
        Value="Collapsed" />
      <ei:ChangePropertyAction PropertyName="Visibility" TargetName="panel2" 
        Value="Visible" />
    </i:EventTrigger>
    <i:EventTrigger>
      <ei:ChangePropertyAction PropertyName="Visibility" TargetName="panel1" 
        Value="Visible" />
      <ei:ChangePropertyAction PropertyName="Visibility" TargetName="panel2" 
        Value="Collapsed" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</HyperlinkButton>

这个超链接是DataTemplate的一部分。这就是我用扳机的原因。当有人单击HyperlinkButton时,将触发一个异步进程。当流程完成后,我想执行第二个触发器。从本质上讲,我正在翻转一些内容的可见性。

我的问题是,当我的事件完成时,我如何触发与HyperlinkButton关联的第二个EventTrigger ?

以编程方式执行一个EventTrigger

使用Interactivity EventTriggers是不正确的。直接回答你的问题,你可以做下一步(我写这个只是因为我不能写这是不可能的,但我为这个解决方案感到羞愧):

使用public Invoke创建自己的动作

    public class MyChangePropertyAction: ChangePropertyAction
    {
        public new void Invoke(object parameter)
        {
            base.Invoke(parameter);
        }
    }

用它代替Interactivity ChangePropertyAction。现在您可以直接从后面的代码获得调用操作:

((MyChangePropertyAction)Interaction.GetTriggers(testHyperlink)[1]).Invoke(parameter);

但是,我相信你可以简单地使用MVVM方法,然后做下一步:

    创建bool属性IsBusy与视图模型中的属性更改通知
  • 将其绑定到你的"panel1"可见性属性,通过boolean antovisibility转换器;
  • 将DoServiceCall从视图模型绑定到"testHyperlink"命令属性;
  • 和视图模型调用服务,并根据是否显示面板将IsBusy属性更改为true或false。
好运