3

我想在 xaml 中实现一个全选复选框。
我在列表视图中有几个(模板化)复选框。然后我在列表视图之外有一个复选框,我想要一个“全选”行为。我可以在我的 ViewModel 中轻松解决问题,但是,我认为在 xaml 中执行此操作会更优雅,因为全选复选框(直接)与我的 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 绑定不起作用,但为什么呢?有什么我想念的吗?

4

2 回答 2

3

我认为您毕竟应该将 Check All 逻辑放在 ViewModel 中。在这篇 Code Project 文章中,WPF Guro Josh Smith 在 ViewModel 中解决了类似的问题(在他的例子中是TreeView和不是ListView),标题如下:“Putting the Smarts in a ViewModel”
我认为在 ViewModel 中实现和调试这个逻辑比做一些MultiBinding你不知道它会咬你的复杂事情更容易。
最后一点 - 我总是听从 Josh 的建议 :-)

于 2011-10-09T06:06:24.777 回答
0

Torsten,如果我不明白您已经尝试过什么,我很抱歉,但是您需要使用以下IsChecked方法将 CheckBoxes 内部的属性绑定到它外部ListViewIsChecked属性:CheckBox

IsChecked="{Binding Path=IsChecked, Mode=OneWay,ElementName=OutsideCheckBox}"
于 2009-05-14T14:58:53.997 回答