以编程方式执行一个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 ?
使用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。