Как я могу предотвратить выбор всей строки DataGrid при первом клике? - PullRequest
1 голос
/ 19 октября 2011

У меня есть WPF Took Kit DataGrid с флажком.Пользователь должен иметь возможность проверять или снимать отметку с одного клика.Но у меня возникает следующая проблема с поведением мыши.

При первом щелчке мышью он выбирает всю строку, а при последующих щелчках - устанавливает или снимает флажок.

Теперь, как мне избежать поведения при первом щелчке мыши, чтобы пользователю не приходилось нажимать несколько раз?

Я бы предпочел DataGrid с флажком без стороннего инструмента, такого как WPF Tool Kit.Буду признателен, если кто-нибудь предоставит мне URL для примера кода без набора инструментов WPF.

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");
                }
            }
        }
    }
  }
}

1 Ответ

1 голос
/ 19 октября 2011

Я решил ту же проблему, применив стиль ячейки к столбцу, содержащему флажок

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. Тем не менее, я уверен, что это все равно будет работать

...