2011-09-08 54 views
0

我在Silverlight中定义的控制如下:编程执行一个EventTrigger

<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的一部分。这就是我使用触发器的原因。当有人点击HyperlinkBut​​ton时,会触发一个异步进程。当进程完成时,我想执行第二个触发器。本质上,我翻转了一些内容的可见性。

我的问题是,当我的事件结束时,我该如何触发与HyperlinkBut​​ton相关的第二个EventTrigger?

回答

1

使用交互性事件触发器不正确。直接回答你的问题,你可以做下一个(我书面方式只因为我coudn't写的,这是不可能的,但我很惭愧该解决方案):

创建自己的行动与公共调用

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

改为使用它交互ChangePropertyAction。现在你可以直接从后面的代码调用操作:

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

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

  • 创建布尔属性IsBusy财产在改变的通知视图模型;
  • 通过BooleanToVisibility转换器将它绑定到您的“panel1”Visibility属性;
  • 将视图模型的DoServiceCall绑定到“testHyperlink”命令属性;
  • 并且在视图模型中进行服务调用,并根据您是否显示面板将IsBusy属性更改为true或false。

祝你好运