c# - 如何利用 MVVM Light EventToCommand 在 XAML 中绑定(bind)大量相同的事件?

标签 c# wpf xaml mvvm mvvm-light

让我解释一下我的要求:

我有一个包含几个这样的复选框的网格:

<Grid>

    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <CheckBox>1</CheckBox>
    <CheckBox
        Grid.Column="1">2</CheckBox>
</Grid>

我清楚地知道如何使用 mvvm light EventToCommand 绑定(bind)到命令(在我的 VM 或其他任何地方定义)。
但是,众所周知,我有多个复选框。所以我必须这样做:
    <CheckBox
        Content="1">
        <i:Interaction.Triggers>
            <i:EventTrigger
                EventName="Checked">
                <ml:EventToCommand
                    Command="{Binding SomeCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </CheckBox>
    <CheckBox
        Grid.Column="1"
        Content="2">
        <i:Interaction.Triggers>
            <i:EventTrigger
                EventName="Checked">
                <ml:EventToCommand
                    Command="{Binding SomeCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </CheckBox>

如果我有更多的复选框,我必须一次又一次地 C+V 以使每个复选框具有相同的 EventToCommand 行为。
更烦人的是,我们还有另一个名为 Unchecked 的事件。通常 Checked 和 Uncheck 的回调是完全一样的。所以我必须一次又一次地 C+V 一次又一次…………

最后我的 XAML 又长又复杂!

===============================================

我正在考虑一些这样的解决方法:

我查看了 Checked 和 Unchecked 事件的源代码,发现它们都是 RoutedEvent,模式为 Bubble,这意味着这个路由事件调用会冒泡到包含它们的网格。
所以我这样写了我的 XAML 代码:
<Grid>  
    <i:Interaction.Triggers>
        <i:EventTrigger
            EventName="ToggleButton.Checked">
            <ml:EventToCommand
                Command="{Binding TestCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    ......several check boxes......
</Grid>

但是上面的代码不起作用。 Checked 和 Unchecked 都不是 ATTACHED 事件。

然后我删除了“ToggleButton.”,像这样:
        <i:EventTrigger
            EventName="Checked">
            <ml:EventToCommand
                Command="{Binding TestCommand}" />
        </i:EventTrigger>

还是行不通! :(

事件应该冒泡到网格上,不是吗?

那么,有人对此有什么好主意吗?
谢谢!

最佳答案

您可以定义一个隐式 Style为所有 CheckBoxesGrid :

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.Resources>
        <Style TargetType="CheckBox">
            <Setter Property="Command" Value="{Binding SomeCommand}" />
        </Style>
    </Grid.Resources>

    <CheckBox>1</CheckBox>
    <CheckBox Grid.Column="1">2</CheckBox>
</Grid>

而不是处理 CheckedUnchecked事件,您可以绑定(bind)到 IsChecked每个 CheckBox 的属性到源属性:
<CheckBox IsChecked="{Binding IsFirstChecked}">1</CheckBox>

关于c# - 如何利用 MVVM Light EventToCommand 在 XAML 中绑定(bind)大量相同的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52535390/

相关文章:

C# 多客户端服务器应用程序的问题

c# - WPF ComboBox 获取突出显示的项目

wpf - WPF 中的本地化

c# - ListView 项目上的 Xamarin Forms AutomationId

xaml - 将相同的交互触发器应用于多个文本框

c# - Async/Await 方法 - 无需等待方法执行

c# - 异步一次性创建

c# - 为什么这个匿名方法不起作用而 lambda 起作用?

c# - 在 WPF 应用程序中使用 C# 调度程序

C# 检测强调色更改 WinRT XAML