首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止在第一次单击时选中整个DataGrid行?

如何防止在第一次单击时选中整个DataGrid行?
EN

Stack Overflow用户
提问于 2011-10-19 05:32:00
回答 1查看 1.6K关注 0票数 1

我有WPF采取套件DataGrid与复选框。用户应该能够选中或取消选中一次点击项目。但是我遇到了以下鼠标点击行为问题。

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

现在,我如何避免第一次鼠标单击行为,以便用户不必多次单击?

我更喜欢没有像WPF工具包这样的第三方工具的复选框DataGrid。如果有人能为我提供没有WPF工具包的示例代码的URL,我将不胜感激。

TasklistView.xaml

代码语言:javascript
运行
复制
 <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

代码语言:javascript
运行
复制
 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");
                }
            }
        }
    }
  }
}
EN

回答 1

Stack Overflow用户

发布于 2011-10-19 05:55:47

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

MyWindow.xaml

代码语言:javascript
运行
复制
    <DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}">
      <DataGridCheckBoxColumn.CellStyle>
        <Style TargetType="DataGridCell">
          <EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter>
        </Style>
      </DataGridCheckBoxColumn.CellStyle>
    </DataGridCheckBoxColumn>

MyWindow.cs

代码语言:javascript
运行
复制
    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。尽管如此,我还是很确定它会工作的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7814014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档