用捆绑作战
本文关键字:作战 | 更新日期: 2023-09-27 18:26:13
我有一些复选框的定义如下:
(这是您可以单击以选中/取消选中所有其他复选框的复选框,让我们称之为*)
<CheckBox Content="Check all" Grid.Column="1" Grid.Row="1" Margin="200 7 0 0" Name="IsCheckedCheckAll"
Checked="IsCheckedCheckAll_Checked" Unchecked="IsCheckedCheckAll_Checked" />
上面的C#代码是:
if (IsCheckedCheckAll.IsChecked == true)
{
IsCheckedCheckAll.Content = "Uncheck all";
}
else
{
IsCheckedCheckAll.Content = "Check all";
}
(下面的复选框取决于上面的复选框,我还有其他几个类似的复选框。让我们称之为**)
<CheckBox Name="Exc2" Grid.Column="1" Grid.Row="3" Margin="200 7 0 0" IsChecked="{Binding IsChecked, ElementName=IsCheckedCheckAll, Mode=OneWay}" />
需要注意的是装订。假设我有另外10个复选框已注册到绑定。然后我可以选中*复选框,这样所有其他具有绑定的复选框都会被选中。现在让我们假设我想取消选中**复选框。这仍然会被标记为已检查,因此插入数据库中的值将是错误的。
我用于确定复选框是否选中的C#代码如下所示:
bool ex2 = (bool) Exc2.IsChecked
如果确实选中了Exc1复选框,但执行绑定的复选框未选中,则此值将返回false。这似乎是一个简单的解决方案,但我无法想出。如果我停止使用绑定,我可以解决它,但我想使用绑定。也许我只是用错了装订?
我试着尽可能好地解释这个问题,我希望它是可以理解的
一切都如我所愿。请参阅下面的示例:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="SomeStyle">
<Style.Triggers>
<Trigger Property="CheckBox.IsChecked" Value="True">
<Trigger.Setters>
<Setter Property="CheckBox.Content" Value="Uncheck all"></Setter>
</Trigger.Setters>
</Trigger>
<Trigger Property="CheckBox.IsChecked" Value="False">
<Trigger.Setters>
<Setter Property="CheckBox.Content" Value="Check all"></Setter>
</Trigger.Setters>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="1" Grid.Row="0" Margin="200 7 0 0" Name="IsCheckedCheckAll" Style="{StaticResource SomeStyle}"/>
<CheckBox Name="Exc2" Grid.Column="1" Grid.Row="1" Margin="200 7 0 0" IsChecked="{Binding IsChecked, ElementName=IsCheckedCheckAll, Mode=OneWay}" />
<CheckBox Name="Exc3" Grid.Column="1" Grid.Row="2" Margin="200 7 0 0" IsChecked="{Binding IsChecked, ElementName=IsCheckedCheckAll, Mode=OneWay}" />
<Button Grid.Column="1" Grid.Row="3" Content="{Binding IsChecked, ElementName=IsCheckedCheckAll}" Click="ButtonBase_OnClick"></Button>
</Grid>
</Window>
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
MessageBox.Show(((bool) Exc2.IsChecked).ToString());
}
}
}
您还可以使用样式和触发器来自动更改*复选框的文本。
问题是我有副本&通过了我的代码,所以它看起来像这样:
bool ex1 = (bool) Exc1.IsChecked, ex2 = (bool) Exc1.IsChecked, ex3 = (bool) Exc1.IsChecked,
ex4 = (bool) Exc1.IsChecked, ex5 = (bool) Exc1.IsChecked;
代替:
bool ex1 = (bool) Exc1.IsChecked, ex2 = (bool) Exc2.IsChecked, ex3 = (bool) Exc3.IsChecked,
ex4 = (bool) Exc4.IsChecked, ex5 = (bool) Exc5.IsChecked;
请注意,顶部代码将ex1、e2、ex3…的所有声明都设置为Exc1.Ischecked。这当然没有像预期的那样起作用,我最终花了将近一个小时来找出问题所在。
经验教训。不要使用c&p盲目:D