如何取消选中 DataTemplate 中的复选框?
How to uncheck checkboxes in a 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;
}
}
我没有你的代码和标记,所以我在一个更简单的视图中完成了这个。
这利用了选中复选框是路由冒泡事件这一事实。
<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;
}
}
}
请注意,当您更改其他复选框时,它们的事件将会触发,但处理程序将忽略那些为假的事件。
您还必须避免更改用户刚刚返回的那个。
当你取消选中你刚刚选中的那个时,我没有停止发射。
因此,除了我分配给您回答问题的 10 分钟时间之外,您可能还需要多考虑一下这个问题。
我在数据网格中有 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;
}
}
我没有你的代码和标记,所以我在一个更简单的视图中完成了这个。
这利用了选中复选框是路由冒泡事件这一事实。
<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;
}
}
}
请注意,当您更改其他复选框时,它们的事件将会触发,但处理程序将忽略那些为假的事件。
您还必须避免更改用户刚刚返回的那个。
当你取消选中你刚刚选中的那个时,我没有停止发射。
因此,除了我分配给您回答问题的 10 分钟时间之外,您可能还需要多考虑一下这个问题。