【问题标题】:Select All Checkbox in XAML using trigger?使用触发器在 XAML 中选择所有复选框?
【发布时间】:2012-11-06 03:19:13
【问题描述】:

我想在 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 绑定不起作用,但为什么呢? 有什么我遗漏的吗?

【问题讨论】:

    标签: wpf checkbox triggers


    【解决方案1】:

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

    【讨论】:

    • 我对此不太满意,因为这显然不是我想要的。但是,我想用简单(丑陋)的方式做它比用更复杂(更漂亮)的方式做更好(我猜复杂会让它变得更丑陋)。
    【解决方案2】:

    Torsten,很抱歉,如果我不明白您已经尝试过什么,但您需要将 ListView 内 CheckBoxes 的 IsChecked 属性绑定到 CheckBoxIsChecked 属性在它之外使用:

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

    【讨论】:

    • 不抱歉。这不是我想要的。正如您在第一个清单中看到的那样,“单个”复选框已经绑定到我的 ViewModel 对象。现在,我还想将单个复选框 IsChecked 属性绑定到“全部”复选框 IsChecked 属性。我正在摆弄 MultiBinding atm,但我还没有解决这个问题。
    猜你喜欢
    • 2017-07-27
    • 2016-06-25
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2016-07-03
    相关资源
    最近更新 更多