2011-03-04 19 views
6

मैं अपनी खिड़की लोड और डेटा ग्रिड भी, मैं SelectedItem और इसे सेट जब एक WPF DataGrid मेरी ViewModelWPF DataGrid: लोड, वर्तमान आइटम पर चयन पर (पर प्रकाश डाला)

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

में कुछ गुण से आबद्ध है ठीक से बांधता है लेकिन पंक्ति को हाइलाइट नहीं किया जाता है। जिस क्षण मैं एक पंक्ति पर क्लिक करता हूं, पंक्ति हाइलाइट और समस्या हल हो जाती है।

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

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

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

enter image description here

उत्तर

7

एक WPF विंडो के लिए DataContext के रूप में एक मॉडल का उपयोग कर, डेटा ग्रिड के 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; 
     } 
    } 
} 
+0

'UIElement' –

+1

पर कोई' Loaded' घटना नहीं है '' DataGrid' Controls' जो एक 'Loaded' घटना है से विरासत // msdn.microsoft.com/en-us/library/system.windows.controls.datagrid_events.aspx) –

+0

@Smurf - रीसेटिंग SelecteItem ने एक समस्या हल की है जिसे मैं कुछ दिनों के लिए समझने की कोशिश कर रहा हूं। धन्यवाद!!! – GilShalit

6

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

तो 2 विकल्प;

  • पंक्ति
  • की कोशिकाओं का चयन करें या पंक्ति हाइलाइट करने के लिए (जो मेरे मन में सबसे अच्छा विकल्प है) एक Style.Trigger बनाने के लिए कोड बनाएँ।

ऐसा करने के लिए XAML फ़ाइल में datagrid के लिए कुछ इस तरह जोड़ें:

  <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> 

आशा है कि यह मदद करता है!

चीयर्स, LTB

0

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

यह 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> 

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

0

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

कारण सटीक "समान" रिकॉर्ड ऑब्जेक्ट को कई बार सम्मिलित कर रहा था। [MSDN डेटा ग्रिड घटनाक्रम] (http:

enter image description here

//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);