WPF DataGrid में सिंगल क्लिक एडिट


92

मैं चाहता हूं कि उपयोगकर्ता सेल को संपादन मोड में डालने में सक्षम हो और पंक्ति को एक सिंगल क्लिक के साथ सम्‍मिलित करें। डिफ़ॉल्ट रूप से, यह डबल क्लिक है।

मैं इसे ओवरराइड या कार्यान्वित कैसे करूं?


क्या आप WPF टूलकिट के भीतर पाए जाने वाले डेटाग्रिड का उपयोग कर रहे हैं?
19

4
क्या आपके लिए यह संभव होगा कि आपने जो कुछ भी आजमाया है उस पर थोड़ी और जानकारी दें और यह कैसे काम नहीं करता है?
ज़च जॉनसन

जवाबों:


76

यहाँ मैंने इस मुद्दे को हल किया है:

<DataGrid DataGridCell.Selected="DataGridCell_Selected" 
          ItemsSource="{Binding Source={StaticResource itemView}}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Nom" Binding="{Binding Path=Name}"/>
        <DataGridTextColumn Header="Age" Binding="{Binding Path=Age}"/>
    </DataGrid.Columns>
</DataGrid>

यह DataGrid एक CollectionViewSource (डमी व्यक्ति ऑब्जेक्ट्स युक्त ) के लिए बाध्य है ।

जादू वहाँ होता है: DataGridCell.Selected = "DataGridCell_Selected"

मैं केवल DataGrid सेल के चयनित ईवेंट को हुक करता हूं, और DataGrid पर BeginEdit () को कॉल करता हूं।

यहाँ घटना हैंडलर के लिए कोड है:

private void DataGridCell_Selected(object sender, RoutedEventArgs e)
{
    // Lookup for the source to be DataGridCell
    if (e.OriginalSource.GetType() == typeof(DataGridCell))
    {
        // Starts the Edit on the row;
        DataGrid grd = (DataGrid)sender;
        grd.BeginEdit(e);
    }
}

8
आप SelectionUnitDataGrid पर गुण सेट करके पहले से चयनित पंक्ति समस्या के आसपास प्राप्त कर सकते हैं Cell
मैट विंकलर

मान लीजिए कि मेरे डेटाग्रिडसेल में एक टेक्स्टबॉक्स है। कॉल करने के बाद grd.BeginEdit(e), मैं चाहता हूं कि उस सेल में टेक्स्टबॉक्स फोकस हो। मैं उसे कैसे कर सकता हूँ? मैंने FindName("txtBox")DataGridCell और DataGrid दोनों पर कॉल करने की कोशिश की , लेकिन यह मेरे लिए शून्य है।
user1214135

GotFocus = "DataGrid_GotFocus" याद आ रहा है?
synergetic

4
यह अच्छा काम करता है, लेकिन मैं ऐसा करने की सलाह नहीं दूंगा। मैंने अपनी परियोजना में इसका उपयोग किया है और मानक डीजी व्यवहार को रोलबैक करने का निर्णय लिया है। भविष्य में, जब आपका डीजी बढ़ेगा और जटिल हो जाएगा, तो आपको सत्यापन के साथ मुद्दे मिलेंगे, नई पंक्तियों और अन्य अजीब व्यवहार को जोड़ना होगा।
सफ़ेद.ज़ाज़

1
@ white.zaz मानक डीजी व्यवहार में रोलबैक करने के बाद क्लाइंट खुश था? क्योंकि यह प्रश्न पूछने का मुख्य कारण यह था कि मानक DG क्षमताओं में संपादन उपयोगकर्ता के अनुकूल नहीं है क्योंकि DG मोड को संपादित करने के लिए आने से पहले इसे कई बार क्लिक करने की आवश्यकता होती है।
AEMLoviji

42

माइकेल बर्जरॉन का जवाब मेरे लिए एक अच्छी शुरुआत थी जो मेरे लिए काम करने वाले समाधान को खोजने के लिए थी। एकल-पंक्ति संपादन के लिए भी एक ही पंक्ति में सेल के लिए पहले से ही संपादन मोड में अनुमति देने के लिए मुझे इसे थोड़ा समायोजित करना पड़ा। SelectionUnit सेल का उपयोग करना मेरे लिए कोई विकल्प नहीं था।

DataGridCell.Selected Event का उपयोग करने के बजाय जो पहली बार किसी पंक्ति के सेल पर क्लिक किया जाता है, मैंने DataGridCell.GotFocus Event का उपयोग किया।

<DataGrid DataGridCell.GotFocus="DataGrid_CellGotFocus" />

यदि आप ऐसा करते हैं, तो आपके पास हमेशा सही सेल केंद्रित और संपादन मोड में होगा, लेकिन सेल में कोई नियंत्रण केंद्रित नहीं होगा, इस तरह मैंने इसे हल किया

private void DataGrid_CellGotFocus(object sender, RoutedEventArgs e)
{
    // Lookup for the source to be DataGridCell
    if (e.OriginalSource.GetType() == typeof(DataGridCell))
    {
        // Starts the Edit on the row;
        DataGrid grd = (DataGrid)sender;
        grd.BeginEdit(e);

        Control control = GetFirstChildByType<Control>(e.OriginalSource as DataGridCell);
        if (control != null)
        {
            control.Focus();
        }
    }
}

private T GetFirstChildByType<T>(DependencyObject prop) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(prop); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild((prop), i) as DependencyObject;
        if (child == null)
            continue;

        T castedProp = child as T;
        if (castedProp != null)
            return castedProp;

        castedProp = GetFirstChildByType<T>(child);

        if (castedProp != null)
            return castedProp;
    }
    return null;
}

3
चेकबॉक्स मेरे लिए काम नहीं कर रहा है? मुझे अभी भी उन्हें डबल क्लिक करना है
थॉमस क्लैमर

9

प्रेषक: http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing

XAML:

<!-- SINGLE CLICK EDITING -->
<Style TargetType="{x:Type dg:DataGridCell}">
    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"></EventSetter>
</Style>

कोड के पीछे:

//
// SINGLE CLICK EDITING
//
private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DataGridCell cell = sender as DataGridCell;
    if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
    {
        if (!cell.IsFocused)
        {
            cell.Focus();
        }
        DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
        if (dataGrid != null)
        {
            if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
            {
                if (!cell.IsSelected)
                    cell.IsSelected = true;
            }
            else
            {
                DataGridRow row = FindVisualParent<DataGridRow>(cell);
                if (row != null && !row.IsSelected)
                {
                    row.IsSelected = true;
                }
            }
        }
    }
}

static T FindVisualParent<T>(UIElement element) where T : UIElement
{
    UIElement parent = element;
    while (parent != null)
    {
        T correctlyTyped = parent as T;
        if (correctlyTyped != null)
        {
            return correctlyTyped;
        }

        parent = VisualTreeHelper.GetParent(parent) as UIElement;
    }

    return null;
}

1
यह कुछ मामलों में काम नहीं करता है, और इसके अधिक जटिल तो Micel Bergerons समाधान है।
स्विस कोड

मेरे लिए, यह लगभग समाधान था। मुझे एक "PreviewMouseLeftButtonUp" ईवेंट हैंडलर जोड़ने की आवश्यकता थी और वहाँ बिल्कुल उसी कोड को रखा गया था।
नेस्टर सॉन्चेज़ ए।

एक बार आपके पास एक कॉम्बोक्स होने पर भी यह काम नहीं करता है। प्रीव्यू क्लिक कॉम्बोक्स के पॉपअप पर क्लिक देखता है, फिर सेल.फोकस कॉल शिकंजा सब कुछ ऊपर। सबसे आसान फिक्स एक इवेंट को जोड़ना है जो माउस ईवेंट के मूल स्रोत को देखता है, उस पर FindVisualParent का उपयोग करके यह देखने के लिए कि क्या यह डेटाग्रिड के अंदर है। यदि नहीं, तो अन्य काम न करें।
जॉन गार्डनर

7

Http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing से समाधान ने मेरे लिए बहुत अच्छा काम किया, लेकिन मैंने रिसोर्सबेड में परिभाषित स्टाइल का उपयोग करके इसे हर डेटाग्रिड के लिए सक्षम किया। संसाधन शब्दकोशों में हैंडलर का उपयोग करने के लिए आपको इसमें एक कोड-पीछे फ़ाइल जोड़ने की आवश्यकता है। यहाँ आप इसे कैसे करते हैं:

यह एक DataGridStyles.xaml संसाधन शब्दकोश है:

    <ResourceDictionary x:Class="YourNamespace.DataGridStyles"
                x:ClassModifier="public"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Style TargetType="DataGrid">
            <!-- Your DataGrid style definition goes here -->

            <!-- Cell style -->
            <Setter Property="CellStyle">
                <Setter.Value>
                    <Style TargetType="DataGridCell">                    
                        <!-- Your DataGrid Cell style definition goes here -->
                        <!-- Single Click Editing -->
                        <EventSetter Event="PreviewMouseLeftButtonDown"
                                 Handler="DataGridCell_PreviewMouseLeftButtonDown" />
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

X नोट करें: मूल तत्व में वर्ग विशेषता। एक वर्ग फ़ाइल बनाएँ। इस उदाहरण में यह DataGridStyles.xaml.cs होगा । इस कोड को अंदर डालें:

using System.Windows.Controls;
using System.Windows;
using System.Windows.Input;

namespace YourNamespace
{
    partial class DataGridStyles : ResourceDictionary
    {

        public DataGridStyles()
        {
          InitializeComponent();
        }

     // The code from the myermian's answer goes here.
}

लिंक डेड (15 कैरेक्टर लिमिट)
Blechdose

4

मैं Dušan Knežević सुझाव के आधार पर इस तरह से पसंद करता हूं। आप एक क्लिक करें यह है))

<DataGrid.Resources>

    <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver"
                                   Value="True" />
                        <Condition Property="IsReadOnly"
                                   Value="False" />
                    </MultiTrigger.Conditions>
                    <MultiTrigger.Setters>
                        <Setter Property="IsEditing"
                                Value="True" />
                    </MultiTrigger.Setters>
                </MultiTrigger>
        </Style.Triggers>
    </Style>

</DataGrid.Resources>

यह काम नहीं करता है अगर एक कॉम्बोक्स का उपयोग एडिटिंग टेम्प्लेट के रूप में किया जाता है, तो मुझे लगता है कि अन्य लोग चेक बॉक्स की तरह मान लेंगे कि माउस की घटनाओं पर भी कब्जा हो जाएगा
स्टीव

मेरे लिए यह कॉम्बोक्स कॉलम के साथ काम करता है, लेकिन "नई आइटम लाइन" (अंतिम पंक्ति) के टेक्स्टबॉक्स में एक अजीब व्यवहार होता है: पहली बार में मुझे इनपुट फ़ोकस मिलता है और जब मैं सेल से माउस को हटाता हूं तो उसमें सामान टाइप कर सकता हूं। , टेक्स्टबॉक्स का मूल्य गायब हो जाता है। आगे टाइप करने पर, नया दर्ज किया गया पाठ सही ढंग से सहेजा जाता है (यह इच्छानुसार एक नई प्रविष्टि बनाता है)। यह एक ComboboxColumn के साथ भी होता है।
फ्रैंकम

शुरू में लगता है कि ठीक काम कर रहा है, लेकिन पूरी तरह से मेरे डाटाग्रिड को गड़बड़ कर दिया, जब मैं सॉर्ट करने की कोशिश करता हूं, तो ये सभी मान गायब हो जाते हैं, इस कोड के बिना सब कुछ छंटनी के साथ ठीक काम करता है।
चंद्रप्रकाश

3

मैंने इसे एक ट्रिगर जोड़कर हल किया, जो कि माउस के ऊपर होने पर DataGridCell की IsEditing True पर सेट करता है। इसने मेरी अधिकांश समस्याओं को हल कर दिया। यह कॉम्बोक्स के साथ भी काम करता है।

<Style TargetType="DataGridCell">
     <Style.Triggers>
         <Trigger Property="IsMouseOver" Value="True">
             <Setter Property="IsEditing" Value="True" />
         </Trigger>
     </Style.Triggers>
 </Style>

1
काम नहीं करता है ... यह माउस सेल छोड़ते ही एडिट खो देता है। इसलिए आप 1) उस सेल पर क्लिक करें जिसे आप संपादित करना चाहते हैं। 2) माउस को 3 से बाहर ले जाएँ) टाइप करना शुरू करें। आपका टाइपिंग काम नहीं करता क्योंकि सेल अब संपादन मोड में नहीं है।
स्कार्सनिक

1
मेरे लिए भी काम नहीं करता है। मेरे लिए टेक्स्टबॉक्स संपादित करने से रोकता है
Blechdose

लेकिन इस दृष्टिकोण के साथ एक समस्या है, मैंने संपादन के लिए 1 कॉलम को लॉक कर दिया था, इस दृष्टिकोण के साथ, यह 1 कॉलम को भी संपादन योग्य बना रहा है!
चंद्रप्रकाश

3

मुझे MVVM में सिंगल क्लिक पर एडिटिंग सेल की तलाश है और यह इसे करने का एक और तरीका है।

  1. Xaml में व्यवहार जोड़ना

    <UserControl xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
                 xmlns:myBehavior="clr-namespace:My.Namespace.To.Behavior">
    
        <DataGrid>
            <i:Interaction.Behaviors>
                <myBehavior:EditCellOnSingleClickBehavior/>
            </i:Interaction.Behaviors>
        </DataGrid>
    </UserControl>
  2. EditCellOnSingleClickBehavior वर्ग System.Windows.Interactivity.Behavior का विस्तार करता है;

    public class EditCellOnSingleClick : Behavior<DataGrid>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.LoadingRow += this.OnLoadingRow;
            this.AssociatedObject.UnloadingRow += this.OnUnloading;
        }
    
        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.LoadingRow -= this.OnLoadingRow;
            this.AssociatedObject.UnloadingRow -= this.OnUnloading;
        }
    
        private void OnLoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.GotFocus += this.OnGotFocus;
        }
    
        private void OnUnloading(object sender, DataGridRowEventArgs e)
        {
            e.Row.GotFocus -= this.OnGotFocus;
        }
    
        private void OnGotFocus(object sender, RoutedEventArgs e)
        {
            this.AssociatedObject.BeginEdit(e);
        }
    }

वोइला!


1

User2134678 के उत्तर के साथ दो मुद्दे हैं। एक बहुत मामूली है और कोई कार्यात्मक प्रभाव नहीं है। अन्य काफी महत्वपूर्ण है।

पहला मुद्दा यह है कि गॉटफोकस वास्तव में डेटाग्रिड के खिलाफ कहा जा रहा है, व्यवहार में डेटाग्रिडेल नहीं। XAML में DataGridCell क्वालिफायर बेमानी है।

उत्तर के साथ मुझे जो मुख्य समस्या मिली, वह यह है कि Enter कुंजी व्यवहार टूट गया है। दर्ज करें आपको सामान्य डेटाग्रिड व्यवहार में वर्तमान सेल के नीचे अगले सेल में जाना चाहिए। हालाँकि, वास्तव में पर्दे के पीछे क्या होता है गोटफोकस घटना को दो बार कहा जाएगा। एक बार वर्तमान सेल फोकस को खो देता है, और एक बार नए सेल को फोकस करने पर। लेकिन जब तक BeginEdit को उस पहली सेल पर बुलाया जाता है, तब तक अगली सेल कभी भी सक्रिय नहीं होगी। अपशॉट यह है कि आपके पास एक-क्लिक का संपादन है, लेकिन जो कोई भी सचमुच ग्रिड पर क्लिक नहीं कर रहा है, वह असुविधाजनक होने वाला है, और एक उपयोगकर्ता-इंटरफ़ेस डिजाइनर को यह नहीं मानना ​​चाहिए कि सभी उपयोगकर्ता पति या पत्नी का उपयोग कर रहे हैं। (कीबोर्ड उपयोगकर्ता टैब का उपयोग करके इसके चारों ओर प्राप्त कर सकते हैं, लेकिन इसका मतलब यह है कि वे हुप्स के माध्यम से कूद रहे हैं कि उन्हें आवश्यकता नहीं होनी चाहिए)।

तो इस समस्या का हल? सेल के लिए ईवेंट कीडाउन संभालें और यदि कुंजी एंटर है, तो एक ध्वज सेट करें, जो पहले सेल पर फायरिंग से BeginEdit को रोकता है। अब Enter कुंजी उसी तरह व्यवहार करती है जैसे उसे करना चाहिए।

आरंभ करने के लिए, अपने DataGrid में निम्न शैली जोड़ें:

<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridCell}" x:Key="SingleClickEditingCellStyle">
        <EventSetter Event="KeyDown" Handler="DataGridCell_KeyDown" />
    </Style>
</DataGrid.Resources>

उस शैली को "सेलशेल" पर लागू करें, कॉलम जिसके लिए आप एक-क्लिक सक्षम करना चाहते हैं।

फिर आपके पीछे के कोड में आपके गॉटफोकस हैंडलर में ध्यान दें (ध्यान दें कि मैं यहां VB का उपयोग कर रहा हूं क्योंकि यही हमारा "वन-क्लिक डेटा ग्रिड रिक्वेस्ट" क्लाइंट विकास भाषा के रूप में चाहता था):

Private _endEditing As Boolean = False

Private Sub DataGrid_GotFocus(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If Me._endEditing Then
        Me._endEditing = False
        Return
    End If

    Dim cell = TryCast(e.OriginalSource, DataGridCell)

    If cell Is Nothing Then
        Return
    End If

    If cell.IsReadOnly Then
        Return
    End If

    DirectCast(sender, DataGrid).BeginEdit(e)
    .
    .
    .

फिर आप KeyDown इवेंट के लिए अपना हैंडलर जोड़ें:

Private Sub DataGridCell_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
    If e.Key = Key.Enter Then
        Me._endEditing = True
    End If
End Sub

अब आपके पास एक डेटाग्रिड है जिसने आउट-ऑफ-द-बॉक्स कार्यान्वयन के किसी भी मौलिक व्यवहार को नहीं बदला है और अभी तक एकल-क्लिक संपादन का समर्थन करता है।


0

मुझे पता है कि मुझे पार्टी में थोड़ी देर हो गई है, लेकिन मुझे एक ही समस्या थी और एक अलग समाधान के साथ आया:

     public class DataGridTextBoxColumn : DataGridBoundColumn
 {
  public DataGridTextBoxColumn():base()
  {
  }

  protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
  {
   throw new NotImplementedException("Should not be used.");
  }

  protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
  {
   var control = new TextBox();
   control.Style = (Style)Application.Current.TryFindResource("textBoxStyle");
   control.FontSize = 14;
   control.VerticalContentAlignment = VerticalAlignment.Center;
   BindingOperations.SetBinding(control, TextBox.TextProperty, Binding);
    control.IsReadOnly = IsReadOnly;
   return control;
  }
 }

        <DataGrid Grid.Row="1" x:Name="exportData" Margin="15" VerticalAlignment="Stretch" ItemsSource="{Binding CSVExportData}" Style="{StaticResource dataGridStyle}">
        <DataGrid.Columns >
            <local:DataGridTextBoxColumn Header="Sample ID" Binding="{Binding SampleID}" IsReadOnly="True"></local:DataGridTextBoxColumn>
            <local:DataGridTextBoxColumn Header="Analysis Date" Binding="{Binding Date}" IsReadOnly="True"></local:DataGridTextBoxColumn>
            <local:DataGridTextBoxColumn Header="Test" Binding="{Binding Test}" IsReadOnly="True"></local:DataGridTextBoxColumn>
            <local:DataGridTextBoxColumn Header="Comment" Binding="{Binding Comment}"></local:DataGridTextBoxColumn>
        </DataGrid.Columns>
    </DataGrid>

जैसा कि आप देख सकते हैं मैंने अपना खुद का DataGridTextColumn लिखा है, जो कि DataGridBoundColumn की उल्टी सब कुछ विरासत में मिला है। GenerateElement Method को ओवरराइड करके और एक Textbox कंट्रोल को वहीं पर वापस करने से एडिटिंग एलिमेंट जेनरेट करने का तरीका कभी नहीं कहलाता। एक अलग परियोजना में मैंने एक डेटपिकर कॉलम को लागू करने के लिए इसका इस्तेमाल किया, इसलिए यह चेकबॉक्स और कॉम्बोक्स के लिए भी काम करना चाहिए।

ऐसा नहीं लगता है कि बाकी डिटैग्रिड्स व्यवहारों को प्रभावित करता है..इसलिए कम से कम मैंने कोई दुष्प्रभाव नहीं देखा है और न ही मुझे अब तक कोई नकारात्मक प्रतिक्रिया मिली है।


-1

अपडेट करें

एक सरल समाधान यदि आप इस बात से ठीक हैं कि आपका सेल एक टेक्स्टबॉक्स (एडिट और नॉन-एडिट मोड के बीच कोई भेद नहीं करता है) रहता है। इस तरह एकल क्लिक संपादन बॉक्स से बाहर काम करता है। यह कंबोबॉक्स और बटन जैसे अन्य तत्वों के साथ भी काम करता है। अन्यथा अद्यतन के नीचे समाधान का उपयोग करें।

<DataGridTemplateColumn Header="My Column header">
   <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
         <TextBox Text="{Binding MyProperty } />
      </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

अपडेट अंत

शेख़ी

मैंने यहाँ और Google पर मिलने वाली हर चीज़ को आज़माया और अपना संस्करण बनाने की भी कोशिश की। लेकिन हर उत्तर / समाधान ने मुख्य रूप से टेक्स्टबॉक्स कॉलम के लिए काम किया, लेकिन अन्य सभी तत्वों (चेकबॉक्स, कॉम्बोक्स, बटन कॉलम) के साथ काम नहीं किया, या उन अन्य तत्व कॉलमों को भी तोड़ दिया या उनके कुछ अन्य दुष्प्रभाव भी थे। डेटाग्रिड बनाने के लिए धन्यवाद microsoft उस बदसूरत तरीके से व्यवहार करता है और हमें उन हैक्स को बनाने के लिए मजबूर करता है। उसकी वजह से मैंने एक ऐसा संस्करण बनाने का फैसला किया, जिसे स्टाइल के साथ सीधे टेक्स्टबॉक्स कॉलम पर लागू किया जा सकता है, अन्य कॉलम को प्रभावित किए बिना।

विशेषताएं

  • पीछे कोई कोड नहीं। MVVM के अनुकूल।
  • यह एक ही या अलग-अलग पंक्तियों में विभिन्न टेक्स्टबॉक्स कोशिकाओं पर क्लिक करते समय काम करता है।
  • TAB और ENTER कुंजियाँ काम करती हैं।
  • यह अन्य स्तंभों को प्रभावित नहीं करता है।

सूत्रों का कहना है

मैंने इस समाधान और @ के उत्तर का उपयोग किया और उन्हें एक संलग्न व्यवहार होने के लिए संशोधित किया। http://wpf-tutorial-net.blogspot.com/2016/05/wpf-datagrid-edit-cell-on-single-click.html

इसे कैसे उपयोग करे

इस शैली को जोड़ें। यह BasedOnमहत्वपूर्ण है जब आप अपने डाटाग्रिड के लिए कुछ फैंसी शैलियों का उपयोग करते हैं और आप उन्हें खोना नहीं चाहते हैं।

<Window.Resources>
    <Style x:Key="SingleClickEditStyle" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
        <Setter Property="local:DataGridTextBoxSingleClickEditBehavior.Enable" Value="True" />
    </Style>
</Window.Resources>

इस तरह CellStyleसे अपने प्रत्येक के साथ शैली लागू करें DataGridTextColumns:

<DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="My Header" Binding="{Binding Comment}" CellStyle="{StaticResource SingleClickEditStyle}" />         
    </DataGrid.Columns>
</DataGrid>

और अब इस क्लास को अपने MainViewModel (या एक अलग Namespace) के समान नामस्थान में जोड़ें। लेकिन तब आपको अन्य नामस्थान उपसर्ग का उपयोग करने की आवश्यकता होगी local)। संलग्न व्यवहारों के बदसूरत बॉयलरप्लेट कोड की दुनिया में आपका स्वागत है।

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace YourMainViewModelNameSpace
{
    public static class DataGridTextBoxSingleClickEditBehavior
    {
        public static readonly DependencyProperty EnableProperty = DependencyProperty.RegisterAttached(
            "Enable",
            typeof(bool),
            typeof(DataGridTextBoxSingleClickEditBehavior),
            new FrameworkPropertyMetadata(false, OnEnableChanged));


        public static bool GetEnable(FrameworkElement frameworkElement)
        {
            return (bool) frameworkElement.GetValue(EnableProperty);
        }


        public static void SetEnable(FrameworkElement frameworkElement, bool value)
        {
            frameworkElement.SetValue(EnableProperty, value);
        }


        private static void OnEnableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is DataGridCell dataGridCell)
                dataGridCell.PreviewMouseLeftButtonDown += DataGridCell_PreviewMouseLeftButtonDown;
        }


        private static void DataGridCell_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            EditCell(sender as DataGridCell, e);
        }

        private static void EditCell(DataGridCell dataGridCell, RoutedEventArgs e)
        {
            if (dataGridCell == null || dataGridCell.IsEditing || dataGridCell.IsReadOnly)
                return;

            if (dataGridCell.IsFocused == false)
                dataGridCell.Focus();

            var dataGrid = FindVisualParent<DataGrid>(dataGridCell);
            dataGrid?.BeginEdit(e);
        }


        private static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            var parent = VisualTreeHelper.GetParent(element) as UIElement;

            while (parent != null)
            {
                if (parent is T parentWithCorrectType)
                    return parentWithCorrectType;

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }

            return null;
        }
    }
}

-3
 <DataGridComboBoxColumn.CellStyle>
                        <Style TargetType="DataGridCell">
                            <Setter Property="cal:Message.Attach" 
                            Value="[Event MouseLeftButtonUp] = [Action ReachThisMethod($source)]"/>
                        </Style>
                    </DataGridComboBoxColumn.CellStyle>
 public void ReachThisMethod(object sender)
 {
     ((System.Windows.Controls.DataGridCell)(sender)).IsEditing = true;

 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.