使用触发器在XAML中选择All Checkbox?

时间:2009-05-14 07:42:51

标签: wpf checkbox triggers

我想在xaml中实现select all复选框 我在listview中有几个(模板化的)复选框。然后我在listview之外有一个复选框,我想要一个“全选” - 行为。 我可以在我的ViewModel中轻松解决问题,但是,我认为在xaml中执行此操作会更优雅,因为select all复选框不会(直接)与我的ViewModel有关。 代码看起来像这样:

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate>
        <CheckBox Content="Globale Eingabe"
            Name="SelectSingle"
            IsChecked="{Binding IsChecked}">
        </CheckBox>
    </DataTemplate>
<ListView.ItemTemplate>  
</ListView>
<CheckBox Name="SelectAll" />

如您所见,SelectSingle的IsChecked属性已绑定到我的ViewModel。所以我认为我需要一个触发器来操纵复选框的状态。

现在我已经尝试过这样了:

<CheckBox Content="Globale Eingabe"
    Name="SelectSingle"
    IsChecked="{Binding IsChecked}">
    <CheckBox.Triggers>
        <Trigger SourceName="SelectAll" Property="IsChecked" Value="True">
            <Setter TargetName="SelectSingle"  Property="IsChecked" Value="True"/>
        </Trigger>
    </CheckBox.Triggers>
</CheckBox>

或者像这样:

<CheckBox Content="Globale Eingabe"
    Name="SelectSingle"
    IsChecked="{Binding IsChecked}">
    <CheckBox.Triggers>
        <DataTrigger Binding="{Binding ElementName=SelectAll, Path=IsChecked}" 
            Value="True">
            <Setter TargetName="Check"
                Property="IsChecked"
                Value="True"/>
        </DataTrigger>
    </CheckBox.Triggers>
</CheckBox>

我也在一个风格中尝试了同样的事情,但无济于事。我总是得到一个错误,沿着“静态成员”的行,在“ContentPresenter”类型中找不到IsCheckedProperty。

现在听起来好像Target / SourceName绑定不起作用,但为什么呢? 有什么东西我不见了吗?

2 个答案:

答案 0 :(得分:3)

我认为你应该把Check All逻辑放在ViewModel中。在this Code Project article中,WPF Guro Josh Smith在ViewModel中解决了类似的问题(在他的情况下是TreeView而不是ListView),标题如下:“将Smarts放在ViewModel中“即可。
我认为在ViewModel中实现和调试这个逻辑要比在一些你不知道它会咬你的地方做一些复杂的MultiBinding更容易。 最后一点 - 我总是遵循Josh的建议: - )

答案 1 :(得分:0)

Torsten,如果我不理解您已尝试过的内容,我很抱歉,但您需要将IsChecked内的CheckBoxes的ListView属性绑定到IsChecked使用以下内容CheckBox的属性:

IsChecked="{Binding Path=IsChecked, Mode=OneWay,ElementName=OutsideCheckBox}"