gpt4 book ai didi

wpf - 如何防止在第一次单击时选择整个DataGrid行?

转载 作者:行者123 更新时间:2023-12-03 10:39:59 24 4
gpt4 key购买 nike

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

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

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

我希望DataGrid带有复选框而不包含WPF Tool Kit这样的第三方工具。如果有人可以在没有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");
}
}
}
}
}
}

最佳答案

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

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。
无论如何,我很确定它仍然可以正常工作

关于wpf - 如何防止在第一次单击时选择整个DataGrid行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814014/

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