• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+1 głos
355 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,320 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ź 530 wizyt
0 głosów
1 odpowiedź 345 wizyt
pytanie zadane 23 kwietnia 2022 w Inne języki przez iendrus Użytkownik (900 p.)
0 głosów
1 odpowiedź 780 wizyt
pytanie zadane 1 września 2016 w C# przez niezalogowany

93,187 zapytań

142,201 odpowiedzi

322,012 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2127p. - dia-Chann
  2. 2092p. - Łukasz Piwowar
  3. 2079p. - Łukasz Eckert
  4. 2037p. - Tomasz Bielak
  5. 2006p. - Michal Drewniak
  6. 2006p. - rucin93
  7. 2005p. - Łukasz Siedlecki
  8. 1964p. - CC PL
  9. 1946p. - Adrian Wieprzkowicz
  10. 1901p. - Mikbac
  11. 1744p. - rafalszastok
  12. 1734p. - Anonim 3619784
  13. 1586p. - Dawid128
  14. 1520p. - Marcin Putra
  15. 1480p. - ssynowiec
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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...