与绑定战斗

时间:2014-10-11 19:27:52

标签: c# wpf

我有一些像这样定义的复选框:

(这是您可以点击以选中/取消选中所有其他复选框的复选框,让我们调用此*)

<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,但取消选中执行绑定的复选框。这似乎是一个简单的修复,但我无法想出它。如果我停止使用绑定,我可以解决它,但我想使用绑定。也许我只是以错误的方式使用绑定?

我尽力解释这个问题,我希望这是可以理解的

2 个答案:

答案 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