wpf datagrid复选框列标题取消/全选

发布于 2024-11-17 04:08:14 字数 1242 浏览 2 评论 0 原文

我正在尝试创建一个带有复选框列的数据网格,该列的标题带有一个用于选择和取消选择行复选框的复选框。我也尝试在没有后台代码的情况下做到这一点。 到目前为止,我已经部分成功,因为我使用数据网格的标签作为绑定中的中间人,并且可以使用数据触发器从标题复选框中取消/选择行的复选框,但是一旦我检查一行,该行中的绑定“死”并且不再受标头影响。另外,我已经尝试过使用单向绑定而不是数据触发器,并得到了相同的结果...... 有谁知道一种方法可以使绑定保持活动状态或使用另一种方法来实现我只在寻找 inxaml 的效果。

标题:

<CheckBox IsChecked="{binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}, Path=Tag}"/>

列模板:

<CheckBox>
    <CheckBox.Style>
        <Style TargetType="{x:Type CheckBox}">
            <Style.Triggers>
                <DataTrigger Binding="{binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}, Path=Tag}" Value="True">
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
                <DataTrigger Binding="{binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}, Path=Tag}" Value="False">
                    <Setter Property="IsChecked" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>

I'm trying to create a datagrid with a checkbox column that has a header with a checkbox that selects and deselects the rows' checkboxes. Also I'm attempting to do it with no behind code.
So far I've been partialy successful in that I used the datagrid's tag as a middle man in the binding, and could de/select the rows' checkboxes from the header checkbox using data triggers but once I check a row the binding in that row 'dies' and it is no longer effected by the header. Also, I already tried it with one way bindings instead of data triggers and got the same result...
Does anyone know of a way to keep the binding alive or pheraps another to achive the effect I'm looking for inxaml only.

header:

<CheckBox IsChecked="{binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}, Path=Tag}"/>

column template:

<CheckBox>
    <CheckBox.Style>
        <Style TargetType="{x:Type CheckBox}">
            <Style.Triggers>
                <DataTrigger Binding="{binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}, Path=Tag}" Value="True">
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
                <DataTrigger Binding="{binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}, Mode=FindAncestor}, Path=Tag}" Value="False">
                    <Setter Property="IsChecked" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

演多会厌 2024-11-24 04:08:14

这实际上是解决这个问题的好主意。我不明白为什么这不起作用。

也就是说,有一些事情可以尝试:

通常将标题复选框和行复选框放在窗口上(而不是在 DataGrid 内),以查看其效果。

另一种选择是尝试命名标头复选框(例如 ),然后使用 {Binding ElementName=cbxHeader Path=Tag}。

另外,在测试时检查 Visual Studio 中的“输出”窗口(在运行时,“调试”>“窗口”>“输出”;它可能显示为空,但只是向上滚动)以获取有关绑定失败原因的任何消息。

您还可以使用虚假的 ValueConverter 来尝试查看绑定是否仍在触发。

That is actually very good idea to solve that problem. I can't see why that shouldn't work.

That said, there are a few things to try:

Place your header checkbox and the row checkbox on a window normally (not inside a DataGrid) to see what effect that has.

The other option is to try naming the Header checkbox (for example <CheckBox Name="cbxHeader") and then binding to it with {Binding ElementName=cbxHeader Path=Tag}.

Also, check the "Output" window in Visual Studio while you are testing (while it is running, Debug > Windows > Output; it might appear empty but just scroll up) for any messages about why the bindings are failing.

You can also use a bogus ValueConverter to try and see if the bindings are still firing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文