用捆绑作战

本文关键字:作战 | 更新日期: 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

相关文章: