【问题标题】:How to get multiple controls to fire same event/command in Silverlight / XAML?如何让多个控件在 Silverlight/XAML 中触发相同的事件/命令?
【发布时间】:2011-01-19 09:02:51
【问题描述】:

我正在使用 Mvvm-Light 命令将事件从我的视图路由到我的视图模型。效果很好。

但我认为我可以更优雅。这实际上可能只是一个标准的 XAML 问题:

我想改变这个(10 个按钮都带有Click="keypadButton_Click" 作为他们的事件处理程序):

<Button  Name="button1" Content="1" Grid.Row="0" Grid.Column="0" Click="keypadButton_Click" />
<Button  Name="button2" Content="2" Grid.Row="0" Grid.Column="1" Click="keypadButton_Click"/>
<Button  Name="button3" Content="3" Grid.Row="0" Grid.Column="2" Click="keypadButton_Click"/>
<Button  Name="button4" Content="4" Grid.Row="1" Grid.Column="0" Click="keypadButton_Click"/>
<Button  Name="button5" Content="5" Grid.Row="1" Grid.Column="1" Click="keypadButton_Click"/>
<Button  Name="button6" Content="6" Grid.Row="1" Grid.Column="2" Click="keypadButton_Click"/>
<Button  Name="button7" Content="7" Grid.Row="2" Grid.Column="0" Click="keypadButton_Click"/>
<Button  Name="button8" Content="8" Grid.Row="2" Grid.Column="1" Click="keypadButton_Click"/>
<Button  Name="button9" Content="9" Grid.Row="2" Grid.Column="2" Click="keypadButton_Click"/>
<Button  Name="button0" Content="0" Grid.Row="3" Grid.Column="1" Click="keypadButton_Click"/>

其中 10 个:

<Button  x:Name="button1" Content="1" Grid.Row="0" Grid.Column="0">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <Command:EventToCommand 
               Command="{Binding KeyPadButtonCommand}"
               CommandParameter="{Binding ElementName=button1, Path=Content }"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

但我不想要那么多 XAML。我认为有一种方法可以“宏观化”触发器,所以它看起来像这样:

<Button  Name="button1" Content="1" Grid.Row="0" Grid.Column="0" 
         Click="{Binding _SendTheEventHere_}" />

"{Binding _SendTheEventHere_}" 应该替换为我不知道的一些魔法咒语,但我知道 stackoverflow 上的一些向导知道:-)。

有意义吗?

【问题讨论】:

  • 我不明白你想这样做。你绑定一个点击事件处理程序会给你什么,你不能用这个硬编码来做。我可以看到,使用命令可以帮助您分离 xaml 和背后的代码,但不能帮助您执行绑定事件处理程序。

标签: silverlight xaml windows-phone-7 triggers mvvm-light


【解决方案1】:

我不确定我是否理解正确,但您可以在 MVVM Light Toolkit here is a sample code 中使用 RelayCommand@

通常 RelayCommand 是您可以使用的 ICommand 接口的实现

【讨论】:

  • 感谢您的评论,但如果您不理解问题,您如何尝试回答?我正在寻找 XAML 语法来“宏化”(简化)第二个文本 sn-p 中的 XAML,因此 ti 看起来更像第三个。
  • 是的,所以您可以使用 RelayCommand (RelayCommand) 编写第二个文本 sn-p。我正在努力提供帮助,至少您的问题对我来说并不清楚。答案的数量表明对其他人也是如此
  • 对不起,如果我听起来很尖刻。如果您可以通过一些示例代码在答案中提供答案,那将非常有帮助。通过查看说明某事的实际代码,我学得最好。我从未使用过 RelayCommand,所以我不确定它在这种情况下如何应用。再次感谢。
  • 在链接中(我给你)你有很好的解释(带有代码示例)
  • Raf,我最初没有看到你的链接。 Stackoverflow 使链接文本与答案文本过于相似。我的错。事实证明,该链接很有帮助!谢谢!但是我实际上无法让它工作。请参阅我对上面保罗回答的评论。
【解决方案2】:

我刚刚使用以下 XAML 运行了一个测试,它似乎可以成功运行:-

您的按钮 XAML:-

<Button Name="MyConfirmButton" 
        Content="Confirm" 
        Grid.Column="1" 
        Style="{StaticResource ButtonStyle}"
        i:Interaction.Triggers="{StaticResource PerformConfirm}">
</Button>

您的资源 XAML:-

<UserControl.Resources>
   <i:EventTrigger x:Key="PerformConfirm" EventName="Click">
      <cmd:EventToCommand Command="{Binding Path=PerformConfirm}" />
   </i:EventTrigger>
</UserControl.Resources>

希望对你有帮助

【讨论】:

  • 我仍然没有看到反对使用 Command 属性的意义。然后你可以简单地写:
  • 您好,Command 属性是否仅在 SL4 中可用?如果是这样,这将不适用于 SL3。
  • 是的,它可用于 SL4,但例如 MVVM Light Toolkit 有它自己的实现:ButtonBaseExtensions.Command,因此您也可以在 SL3 中使用它。那么它将是:
  • 感谢 Raf 指出这一点。它使我的 XAML 更加干净。
  • 这看起来很棒。但是,我收到“在 'ButtonBaseExtensions' 类型中找不到可附加属性 'Command'。我使用的是 WP7 版本的 Mvvm-Light,但这应该没有什么区别吗?
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多