WPF Datagrid: लोड पर, वर्तमान आइटम पर चयन(हाइलाइटिंग)




initialization selection (4)

मेरे पास एक व्यू मॉड्यूल में कुछ गुणों के लिए WPF Datagrid है

<DataGrid AutoGenerateColumns="False" Name="dataGrid" SelectionMode="Single"
          ItemsSource="{Binding ItemList}" SelectedItem="{Binding SelectedItem}">
...
</DataGrid>

जब मेरी विंडो लोड और डेटाग्रिड भी, मैं SelectedItem इमेज सेट करता हूं और यह ठीक से बाँधता है, लेकिन पंक्ति हाइलाइट नहीं की गई है। जब मैं एक पंक्ति पर क्लिक करता हूं, पंक्ति हाइलाइट करता हूं और समस्या हल हो जाती है।

मैं लोड / आरंभीकरण पर DataGrid में SelectedItem का हाइलाइटिंग कैसे सेट / ट्रिगर कर सकता / सकती हूं?

संपादित करें:

यह वास्तव में चुना गया है क्योंकि मेरे पास थोड़ा चयन कक्ष है यह केवल हाइलाइटिंग का प्रतिपादन है जो ट्रिगर नहीं करता।


मुझे एक ही "समस्या" थी और अंत में समस्या का एक बहुत अच्छा समाधान मिला। जैसा कि आपने पहले ही कहा है कि पंक्ति चयनित नहीं है, लेकिन यह पंक्ति को उजागर नहीं करता है यदि आप सावधानी से देखते हैं तो आप देखेंगे कि जब आप पंक्ति में कहीं भी (माउस का उपयोग करके) क्लिक करते हैं, तो यह अभी भी पंक्ति को उजागर नहीं करता है, केवल उसके भीतर के कक्ष

तो 2 विकल्प;

  • पंक्ति के कक्षों का चयन करने के लिए कोड बनाएं
  • या एक शैली बनाएँ। पंक्ति को उजागर करने के लिए ट्रिगर (जो मेरे दिमाग में सबसे अच्छा विकल्प है)

ऐसा करने के लिए, xaml-file में डेटाग्रिड से कुछ ऐसा जोड़ें:

            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="DodgerBlue"/>
                            <Setter Property="Foreground" Value="White"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>

आशा करता हूँ की ये काम करेगा!

चीयर्स, एलटीबी


जब एक WPF विंडो के लिए डेटाकॉन्टेक्स्ट के रूप में मॉडल का उपयोग करते हैं, तो डेटाग्रिड का SelectionChanged चेंजेड ईवेंट को खिड़की के लोड होने तक तक नहीं बुलाया जाता है, यही वजह है कि पंक्ति को कभी भी हाइलाइट नहीं किया जाता है और केवल आंशिक हाइलाइट के साथ आपको पहली पंक्ति दिखाई देती है। वहाँ एक और अधिक सुंदर तरीका हो सकता है, लेकिन यहां एक काम है-आस-पास।

खिड़की के भरी हुई घटना या डेटाग्रिड के भरी हुई इवेंट में, SelectedItem बाइंडिंग को रीसेट करें:

public MainWindow()
{
    InitializeComponent(); 
    this.Loaded += new RoutedEventHandler( OnLoaded );
}

// could also be placed in the DataGrid's loaded event handler
private void OnLoaded( object sender, RoutedEventArgs e )
{
    if( dataGrid != null && Model.SelectedItem != null )
    {
        var selected = Model.SelectedItem;
        Model.SelectedItem = null;
        Model.SelectedItem = selected;
    }
}

यहाँ एक पूरा काम नमूना है

XAML

<Window x:Class="WpfDataGridHighlightOnLoad.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:model="clr-namespace:WpfDataGridHighlightOnLoad" 
        Title="MainWindow" Height="350" Width="525">

    <Window.DataContext>
        <model:MainWindowModel x:Name="Model" />
    </Window.DataContext>

    <Grid>
        <DataGrid AutoGenerateColumns="True" SelectionMode="Single"
                  HorizontalAlignment="Stretch" 
                  Name="dataGrid" 
                  VerticalAlignment="Top"
                  ItemsSource="{Binding ItemList}"
                  SelectedItem="{Binding SelectedItem}">
        </DataGrid>

        <Button Content="Cycle Selection" Click="OnCycleClick" 
                Height="23" 
                HorizontalAlignment="Right" 
                Name="button1" 
                VerticalAlignment="Bottom" Width="125" />

        <Button Content="Reset Grid" Click="OnResetClick" 
                Height="23" 
                HorizontalAlignment="Left" 
                Name="button2" 
                VerticalAlignment="Bottom" Width="125" />

    </Grid>
</Window>

कोड के पीछे

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;

namespace WpfDataGridHighlightOnLoad
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();   
            this.Loaded += new RoutedEventHandler( OnLoaded );
        }

        // could also be placed in the DataGrid's loaded event handler
        private void OnLoaded( object sender, RoutedEventArgs e )
        {
            if( dataGrid != null && Model.SelectedItem != null )
            {
                var selected = Model.SelectedItem;
                Model.SelectedItem = null;
                Model.SelectedItem = selected;
            }
        }

        private void OnCycleClick( object sender, RoutedEventArgs e )
        {
            int index = Model.ItemList.IndexOf( Model.SelectedItem );
            index = index == Model.ItemList.Count - 1 ? 0 : index + 1;
            Model.SelectedItem = Model.ItemList[index];
        }

        private void OnResetClick( object sender, RoutedEventArgs e )
        {
            Model.Reset();
        }
    }

    public class MainWindowModel : INotifyPropertyChanged
    {
        public MainWindowModel()
        {
            Reset();
        }

        public void Reset()
        {
            ItemList = new List<Person>
                           {
                               new Person("Joe", 20),
                               new Person("John", 30),
                               new Person("Jane", 40),
                               new Person("Jill", 50),
                               new Person("Fido", 7),
                           };

            SelectedItem = ItemList[2];
        }

        private Person _selectedItem;
        public Person SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                NotifyPropertyChanged( "SelectedItem" );
            }
        }

        private List<Person> _itemList;
        public List<Person> ItemList
        {
            get { return _itemList; }
            set
            {
                _itemList = value;
                NotifyPropertyChanged( "ItemList" );
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged( String info )
        {
            if( PropertyChanged != null )
            {
                PropertyChanged( this, new PropertyChangedEventArgs( info ) );
            }
        }

        #endregion
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person( string name, int age )
        {
            Name = name;
            Age = age;
        }

        public override string ToString()
        {
            return Name;
        }
    }
}

यह एक पुराना एक है, लेकिन किसी भी पोस्ट में जवाब में से कोई भी इसे बिल्कुल सही नहीं लगता है आप जो काम करना चाहते हैं वह काम करना है: यानी हाइलाइटिंग वही है, जो कि नियंत्रण कभी भी केंद्रित था (ऐसा कुछ ऐसा लगता है जो प्रासंगिक है)।

यह एक DataGridRow शैली के साथ किया जा सकता है, लेकिन चाल खुद को रंग निर्दिष्ट करने के लिए नहीं है, लेकिन डिफ़ॉल्ट रंग का उपयोग करने के लिए है, इसलिए सबकुछ बस काम करता है एक अतिरिक्त झुंझलाहट इस तथ्य से आता है कि यह कोशिकाओं को प्रकाश डाला गया है, न कि पंक्तियों पर, इसलिए आपको मूल रूप से सेल हाइलाइटिंग शैली को डुप्लिकेट करने की आवश्यकता है:

<Style
    x:Key="DataGridRowStyle"
    TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition
                    Property="IsKeyboardFocusWithin"
                    Value="False" />
                <Condition
                    Property="IsSelected"
                    Value="True" />
            </MultiTrigger.Conditions>
            <Setter
                Property="Background"
                Value="{DynamicResource
                    {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}" />
            <Setter
                Property="Foreground"
                Value="{DynamicResource
                    {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}" />
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition
                    Property="IsKeyboardFocusWithin"
                    Value="True" />
                <Condition
                    Property="IsSelected"
                    Value="True" />
            </MultiTrigger.Conditions>
            <Setter
                Property="Background"
                Value="{DynamicResource
                    {x:Static SystemColors.HighlightBrushKey}}" />
            <Setter
                Property="Foreground"
                Value="{DynamicResource
                    {x:Static SystemColors.HighlightTextBrushKey}}" />
        </MultiTrigger>
    </Style.Triggers>
</Style>

ध्यान दें कि एक संग्रह है, जो कि RowStyle शैली को ओवरराइड करने की आवश्यकता वाले पंक्ति संदर्भ मेनू को सेट करना है, इसलिए यदि आप इसे विश्व स्तर पर करते हैं और यह काम नहीं कर रहा है, तो जांच लें कि आपका RowStyle ओवरराइड नहीं किया गया है।


एक ही मुद्दे पर, एक डब्लमीएफ़एफ़ डाटाग्रिड में डमी डेटा डालते समय, फिर पंक्ति के आदेश को बदलने की कोशिश कर रहा है। पंक्ति हाइटलाइटिंग बंकेड (नीचे चित्र)

कारण सटीक "समान" रिकॉर्ड ऑब्जेक्ट कई बार डालने गया था

//Ex: Messes up highlighting.    
grid.Items.Add(rowObj);
grid.Items.Add(rowObj);
grid.Items.Add(rowObj);

//Ex: Highlighting OK.  Create a new object each time.  Even if all columns have exact same values.  
rowobj = new .....
grid.Items.Add(rowObj);

rowobj = new .....
grid.Items.Add(rowObj);






highlighting