gpt4 book ai didi

wpf - 带有 DataGrid WPF 的复选框

转载 作者:行者123 更新时间:2023-12-04 16:21:29 25 4
gpt4 key购买 nike

我正在尝试使用 MVVM 在 WPF 4.0 中创建一个 DataGrid ...

所需功能 -

  • Muti - 使用复选框选择行(单击)
  • 选中所有复选框以选中数据网格中的所有复选框

  • 像这样的东西-

    enter image description here

    已经2天了,我无法弄清楚如何有效地解决问题..

    一个可行的例子是我现在需要的尽快..

    如果有人有一个可行的解决方案与我分享,我将不胜感激......

    N请不要告诉我用谷歌搜索这个东西,因为没有任何东西适合我......

    更新 -
  • 我正在使用自动生成列
  • 我不想在我的模型中添加“IsSelected”或任何此类属性。
  • 我只是面临 2 个问题 -

  • 首先,“全选”功能,即选中复选框上的所有复选框单击列标题中存在的复选框...(我可以选择和取消选择数据网格,但无法勾选/取消勾选复选框)

    其次,在不按住 Ctrl 键的情况下单击鼠标进行多选。

    最佳答案

    当你使用 MVVM 时,你必须知道什么是数据,什么是严格的 UI。

    是您的SelectedItems将成为您数据的一部分,还是仅成为您的 UI?

    如果它是您数据的一部分,您真的应该有一个 IsSelected数据模型上的属性,即使这意味着扩展数据类以包含 IsSelected属性,或创建仅包含 bool IsSelected 的包装类和 object MyDataItem .第一个选项可能是首选,因为您可以保留 AutoGenerateColumns="True" ,并且它使列绑定(bind)更简单。

    然后你只需绑定(bind)你的DataGridRow.SelectedItemIsSelected数据项的属性:

    <Style TargetType="{x:Type DataGridRow}">
    <Setter Property="IsSelected" Value="{Binding IsSelected}" />
    </Style>

    但是,如果您的 SelectedItems仅适用于 UI,或者如果您在这种情况下由于某种原因破坏了 MVVM 模式,那么您可以创建未绑定(bind)的 CheckBox并在后面使用一些代码来确保 CheckBox已正确同步到 SelectedItem .

    我做了一个快速示例应用程序,我的代码如下所示:

    首先,我刚刚添加了未绑定(bind)的 CheckBox使用 DataGridTemplateColumn 将列添加到列列表.这将在 AutoGenerateColumns 之前添加列列表。
    <DataGrid x:Name="TestDataGrid" ItemsSource="{Binding Test}" 
    SelectionMode="Extended" CanUserAddRows="False"
    PreviewMouseLeftButtonDown="TestDataGrid_PreviewMouseLeftButtonDown_1">
    <DataGrid.Columns>
    <DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <CheckBox x:Name="TestCheckBox"
    PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown" />
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    </DataGrid.Columns>
    </DataGrid>

    其次,我添加了 PreviewMouseDown事件到 CheckBox使其设置 IsSelected行的属性。

    private void CheckBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
    var chk = (CheckBox)sender;
    var row = VisualTreeHelpers.FindAncestor<DataGridRow>(chk);
    var newValue = !chk.IsChecked.GetValueOrDefault();

    row.IsSelected = newValue;
    chk.IsChecked = newValue;

    // Mark event as handled so that the default
    // DataGridPreviewMouseDown doesn't handle the event
    e.Handled = true;
    }

    它需要导航 VisualTree找到 DataGridRow与点击的 CheckBox 相关联选择它,为了让生活更轻松,我使用了一些自定义 VisualTreeHelpers that I have on my blog找到 DataGridRow .您可以使用相同的代码,也可以创建自己的方法来搜索 VisualTree .

    最后,如果用户点击 CheckBox 以外的任何地方,我们要禁用默认 DataGrid评选事件。这确保了 IsSelected值只会在您单击 CheckBox 时发生变化.

    有多种方法可以禁用不同级别的选择,但为了简单起见,我只是禁用了 DataGrid.PreviewMouseLeftButtonDown用户未点击 CheckBox 时的事件.

    private void TestDataGrid_PreviewMouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
    {
    var chk = VisualTreeHelpers.FindAncestor<CheckBox>((DependencyObject)e.OriginalSource, "TestCheckBox");

    if (chk == null)
    e.Handled = true;
    }

    我使用我的自定义 VisualTreeHelpers再次导航可视化树并确定是否单击了 CheckBox,如果用户单击了 CheckBox 以外的任何位置,则取消事件.

    至于您添加 CheckBox 的第二个请求至 SelectAllUnselectAll项目,这将再次取决于您的选择是 UI 还是数据的一部分。

    如果它是 UI 的一部分,只需添加 CheckBoxDataGridTemplateColumn.HeaderTemplate ,当它被点击时,循环遍历 DataGrid.Rows , 找到 CheckBox在第一列中,然后选中或取消选中它。

    如果它是数据的一部分,你仍然可以做同样的事情(只在 DataGrid.Items 中设置边界值而不是 CheckBox.IsChecked 中的 DataGrid.Rows),或者你可以像 Adolfo Perez suggested 那样做,并将其绑定(bind)到 ViewModel 上的属性.

    关于wpf - 带有 DataGrid WPF 的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17114603/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com