• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

XAML WPF DataGrid - SingleClick zamienieł się w DoubleClick

+1 głos
467 wizyt
pytanie zadane 29 maja 2022 w Inne języki przez Szabranigdo Obywatel (1,370 p.)
Wprowadziłem do projektu LostFocus dla zachowania oryginalnego podświetlenia itema w DataGridzie po tym jak zniknie defaultowe, zepsuło mi to jednak możliwość przeskakiwania go kolejnego wiersza za pomocą pojedynczego kliknięcia. Teraz aby podświetlić kolejnego itema muszę kliknąć dwa razy chyba że pierwszym kliknięciem będzie wybranie innego elementu z poza DataGrid czyli np TextBox.

Nie proszę o naprawę kodu tylko wyjaśnienie od strony teoretycznej co się nawyprawiało bo nawet nie wiem jak to ugryźć.

1 odpowiedź

+1 głos
odpowiedź 2 czerwca 2022 przez VBService Ekspert (256,600 p.)
wybrane 5 czerwca 2022 przez Szabranigdo
 
Najlepsza

Może zrób podświetlanie item-a po utracie focus-a przez DataGrid bez używania zdarzenia LostFocus, ale za pomocą <Style.Triggers>

 

przykład

MainWindow.xaml

<Window x:Class = "WPFDataGridControl.MainWindow"
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   Title = "MainWindow" Height = "348" Width = "279">

    <Grid Width="502">
        <DataGrid Name = "dataGrid" AlternatingRowBackground = "LightBlue"  
                  AlternationCount = "2" AutoGenerateColumns = "False" Margin="12,12,251,134">

            <DataGrid.Columns>
                <DataGridTextColumn Header = "Name" Binding = "{Binding Name}" />
                <DataGridTextColumn Header = "Surname" Binding = "{Binding Surname}" />
                <DataGridCheckBoxColumn Header = "Is on holiday?" Binding = "{Binding IsOnHoliday}" />
            </DataGrid.Columns>
            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="Green" />
                            <Setter Property="BorderBrush" Value="Darkgreen" />
                            <Setter Property="TextElement.Foreground" Value="White"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>

        </DataGrid>
        <TextBox Height="27" HorizontalAlignment="Left" Margin="12,181,0,0"
                 Name="textBox" VerticalAlignment="Top" Width="239" />
    </Grid>

</Window>

 

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WPFDataGridControl
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml 
    /// </summary>

    public partial class MainWindow : Window
    {
        private string PlaceholderText = "Zaznacz wiersz w DG i wstaw tu kursor";
        public MainWindow()
        {
            InitializeComponent();
            dataGrid.ItemsSource = Employee.GetEmployees();

            textBox.Text = PlaceholderText;
            textBox.LostFocus += AddPlaceholder;
            textBox.GotFocus += RemovePlaceholder;
        }

        public void RemovePlaceholder(object sender, EventArgs e)
        {
            if (textBox.Text == PlaceholderText)
                textBox.Text = String.Empty;
        }

        public void AddPlaceholder(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(textBox.Text))
                textBox.Text = PlaceholderText;
        }
    }

    public class Employee : INotifyPropertyChanged
    {
        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                RaiseProperChanged();
            }
        }

        private string surname;
        public string Surname
        {
            get { return surname; }
            set
            {
                surname = value;
                RaiseProperChanged();
            }
        }

        private bool isOnHoliday;
        public bool IsOnHoliday
        {
            get { return isOnHoliday; }
            set
            {
                isOnHoliday = value;
                RaiseProperChanged();
            }
        }

        public static ObservableCollection<Employee> GetEmployees()
        {
            var employees = new ObservableCollection<Employee>();

            employees.Add(new Employee()
            {
                Name = "Mariusz",
                Surname = "Kowalski",
                IsOnHoliday = true
            });

            employees.Add(new Employee()
            {
                Name = "Jacek",
                Surname = "VBService",
                IsOnHoliday = false
            });

            employees.Add(new Employee()
            {
                Name = "Katarzyna",
                Surname = "Mazur",
                IsOnHoliday = true
            });

            employees.Add(new Employee()
            {
                Name = "Tomasz",
                Surname = "Lewandowski",
                IsOnHoliday = false
            });

            employees.Add(new Employee()
            {
                Name = "Kamil",
                Surname = "Zamojski",
                IsOnHoliday = true
            });

            employees.Add(new Employee()
            {
                Name = "Magdalena",
                Surname = "Piasecka",
                IsOnHoliday = false
            });

            return employees;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void RaiseProperChanged([CallerMemberName] string caller = "")
        {

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(caller));
        }
    }
}

 

1
komentarz 5 czerwca 2022 przez Szabranigdo Obywatel (1,370 p.)
Dziękuję za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 615 wizyt
0 głosów
1 odpowiedź 475 wizyt
pytanie zadane 23 kwietnia 2022 w Inne języki przez iendrus Użytkownik (900 p.)
0 głosów
1 odpowiedź 912 wizyt
pytanie zadane 1 września 2016 w C# przez niezalogowany

93,631 zapytań

142,555 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...