首页 > 解决方案 > 如何取消选中 DataTemplate 中的复选框?

问题描述

我在数据网格中有 4 个复选框。我想IsChecked = false在激活复选框时设置其他三个复选框。由于使用DataTemplate,我无权使用名称控件。

使用发件人,我一次只能访问一个控件。但我想关闭 3 个复选框并激活一个复选框。

这是我的模板:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <StackPanel Orientation="Vertical" Margin="5" HorizontalAlignment="Right">
            <Metro:MetroSwitch Checked="chk_Checked" Tag="exc" Margin="0,2"  Name="chkExcelent">خیلی خوب</Metro:MetroSwitch>
            <Metro:MetroSwitch Checked="chk_Checked" Tag="good" Margin="0,2" Name="chkGood">خوب</Metro:MetroSwitch>
            <Metro:MetroSwitch Checked="chk_Checked" Tag="notbad" Margin="0,2" Name="chkNotBad">قابل قبول</Metro:MetroSwitch>
            <Metro:MetroSwitch Checked="chk_Checked" Tag="bad"  Name="chkBad">نیاز به تلاش بیشتر</Metro:MetroSwitch>
        </StackPanel>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

这是我的代码隐藏:

private void chk_Checked(object sender, RoutedEventArgs e)
{
    switch ((sender as Arthas.Controls.Metro.MetroSwitch).Tag.ToString())
    {
        case "exc": Console.WriteLine("exc"); break;
        case "good": Console.WriteLine("ggg"); break;
        case "notbad": Console.WriteLine("nb"); break;
        case "bad": Console.WriteLine("bad"); break;
    }
}

标签: c#wpfxamlcheckboxdatatemplate

解决方案


我没有您的代码和标记,因此我以更简单的方式完成了此操作。
这使用了检查复选框是路由冒泡事件的事实。

<Grid>
    <StackPanel  ToggleButton.Checked="StackPanel_Checked">
        <CheckBox />
        <CheckBox />
        <CheckBox />
        <CheckBox />
    </StackPanel>
</Grid> 

    private void StackPanel_Checked(object sender, RoutedEventArgs e)
    {
        CheckBox cb = e.OriginalSource as CheckBox;
        if(cb.IsChecked == false)
        {
            return;
        }
        foreach (var item in ((StackPanel)sender).Children)
        {
            if(item != cb)
            {
                ((CheckBox)item).IsChecked = false;
            }
        }
    }

请注意,当您更改其他复选框时,它们的事件将触发,但处理程序将忽略那些设为 false 的事件。
您还必须避免更改用户刚刚检查回来的那个。
当您取消选中刚刚选中的那个时,我并没有停止发射。
因此,您可能需要比我分配用于回答您的问题的 10 分钟多一点时间来考虑这个问题。


推荐阅读