• 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

Object Storage Arubacloud
+1 głos
168 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 (252,660 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ź 478 wizyt
0 głosów
1 odpowiedź 266 wizyt
pytanie zadane 23 kwietnia 2022 w Inne języki przez iendrus Użytkownik (900 p.)
0 głosów
1 odpowiedź 714 wizyt
pytanie zadane 1 września 2016 w C# przez niezalogowany

92,545 zapytań

141,387 odpowiedzi

319,503 komentarzy

61,930 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...