【问题标题】:How can I prevent the entire DataGrid row from being selected on the first click?如何防止在第一次单击时选择整个 DataGrid 行?
【发布时间】:2011-12-10 11:17:59
【问题描述】:

我有带有复选框的 WPF Take Kit DataGrid。用户应该能够在单击时选中或取消选中项目。但是我遇到了以下鼠标单击行为问题。

在第一次鼠标单击时,它会选择整行,在随后的单击中,它会选中或取消选中复选框。

现在如何避免首次鼠标点击行为,让用户不必多次点击?

我更喜欢带有复选框的 DataGrid,没有像 WPF 工具包这样的第三方工具。如果有人可以在没有 WPF 工具包的情况下向我提供示例代码的 URL,我将不胜感激。

TasklistView.xaml

 <UserControl x:Class="MyProject.TasklistView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="742" Width="1024" >

  <Grid>
    <toolkit:DataGrid x:Name="dgMyTaskList" 
                      SelectionMode="Single"  
                      ItemsSource="{Binding Path=MyTaskList}"
                      AutoGenerateColumns="False"                                      
                      SelectedItem="{Binding Path=SelectedTaskItem,
                      UpdateSourceTrigger=PropertyChanged}" >



        <toolkit:DataGrid.Columns>
            <toolkit:DataGridCheckBoxColumn 
                      Header="Select" 
                      Binding="{Binding Path=IsSelected}"  />

            <toolkit:DataGridTextColumn 
                      Header="Task ID" 
                      Width="100" 
                      Binding="{Binding TaskID}" 
                      IsReadOnly="True" />

            <toolkit:DataGridTextColumn 
                      Header="Task Description" 
                      Width="*" Binding="{Binding TaskDescription}"
                      IsReadOnly="True" />

            <toolkit:DataGridTextColumn 
                      Header="Due Date" Width="*" 
                      Binding="{Binding DueDate}" 
                      IsReadOnly="True" />

        </toolkit:DataGrid.Columns>
    </toolkit:DataGrid>
   </Grid>
 </UserControl>

TasklistViewModel.cs

 using System;
 using System.ComponentModel;
 using System.Collections.Generic;
 using System.Windows.Forms;
 using System.Windows;
 using System.Windows.Data;
 using System.Windows.Input;
 using System.Windows.Controls;
 using System.Collections.ObjectModel;
 using System.Text;
 using System.IO;


 namespace MyProject
 {
  public class TasklistViewModel: ViewModelBase
  {

    ObservableCollection<TaskModel> _TaskList;
    public TasklistViewModel()
    {
        _MyTaskList= dal.GetTaskList());
    }

    public ObservableCollection<TaskModel> MyTaskList
    {
        get { return _MyTaskList; }
        set
        {
            if (_MyTaskList!= value)
            {
                this._MyTaskList= value;
                this.OnPropertyChanged("MyTaskList");
            }
        }

    }

    private TaskModel _SelectedTaskItem;
    public TaskModel SelectedTaskItem
    {
        get { return _SelectedTaskItem; }
        set
        {

            if (value != null)
            {
                _SelectedTaskItem= value;
                OnPropertyChanged("SelectedTaskItem");

                if (null != _SelectedTaskItem)
                {
                    ObservableCollection<TaskModel> oCol =
                        new ObservableCollection<TaskModel>();
                    foreach (TaskModel itm in MyTaskList)
                    {
                        if (itm.TaskID == _SelectedTaskItem.BundleID)
                        {
                            itm.IsSelected = _SelectedTaskItem.IsSelected;
                        }
                        oCol.Add(itm);

                    }
                    MyTaskList.Clear();
                    MyTaskList = oCol;
                    OnPropertyChanged("MyTaskList");
                }
            }
        }
    }
  }
}

【问题讨论】:

  • DataGrid 包含在 WPF4 中,您可以将您的解决方案升级到 .NET 4.0 吗?

标签: wpf mvvm datagrid checkbox toolkit


【解决方案1】:

我通过在包含复选框的列上应用单元格样式解决了同样的问题

MyWindow.xaml

    <DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}">
      <DataGridCheckBoxColumn.CellStyle>
        <Style TargetType="DataGridCell">
          <EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter>
        </Style>
      </DataGridCheckBoxColumn.CellStyle>
    </DataGridCheckBoxColumn>

MyWindow.cs

    private void ApprovedMouseUp(object sender, MouseButtonEventArgs e)
    {
        if(sender is DataGridCell)
        {
            var temp = (sender as DataGridCell).Content;
            if(temp is CheckBox) (temp as CheckBox).IsChecked = !(temp as CheckBox).IsChecked;
        }
    }

我没有使用 WPF 工具包,而是使用 DataGrid i .NET 4.0。 无论如何,我很确定它无论如何都会起作用

【讨论】:

  • 你能帮我把上面的 ApprovedMouseUP 事件转换成 MVVM 模式吗?仅供参考:我正在使用 relayCommand 和 INotifyPropertyChanged 但我很难理解如何在没有第三方库的情况下将 codebehid 转换为 MVVM。
  • 为什么不使用属于xaml的.cs文件。它与 mvvm 无关,但您实际上只是扩展了复选框的功能。如果您在视图模型中指定事件但尝试一下,我不知道会发生什么。
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2011-03-31
  • 1970-01-01
  • 2015-06-20
  • 2019-02-04
相关资源
最近更新 更多