我有一些像这样定义的复选框:
(这是您可以点击以选中/取消选中所有其他复选框的复选框,让我们调用此*)
<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,但取消选中执行绑定的复选框。这似乎是一个简单的修复,但我无法想出它。如果我停止使用绑定,我可以解决它,但我想使用绑定。也许我只是以错误的方式使用绑定?
我尽力解释这个问题,我希望这是可以理解的
答案 0 :(得分:1)
事情正如我所期待的那样。见下面的示例:
<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());
}
}
}
您还可以使用样式和触发器自动更改*复选框的文本。
答案 1 :(得分:0)
问题在于我复制并过了我的代码,所以它看起来像这样:
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&amp; p:D