【问题标题】:Programmatically Execute an EventTrigger以编程方式执行 EventTrigger
【发布时间】:2011-09-08 17:42:21
【问题描述】:

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

我的问题是,当我的事件完成后,如何触发与 HyperlinkBut​​ton 关联的第二个 EventTrigger?

【问题讨论】:

    标签: c# silverlight


    【解决方案1】:

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

    使用公共调用创建自己的操作

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

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

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

    但是,我相信您可以简单地使用 MVVM 方法并执行下一步:

    • 在视图模型中创建带有属性更改通知的布尔属性 IsBusy;
    • 通过 BooleanToVisibility 转换器将其绑定到您的“panel1”可见性属性;
    • 将命令 DoServiceCall 从视图模型绑定到“testHyperlink”命令属性;
    • 并在视图模型中进行服务调用并将 IsBusy 属性更改为 true 或 false,具体取决于您是否显示面板。

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2021-06-06
      相关资源
      最近更新 更多