2011-02-14 18 views
6

पर क्लिक करके मैंने CellGditingTemplate के साथ डेटाग्रिड का उपयोगकर्ता नियंत्रण लिखा था। इस संपादन-टेम्पलेट का डेटा टेम्पलेट टेक्स्टबॉक्स है, और कर्सर टेक्स्टबॉक्स में तीन बार क्लिक करके जाएगा, मैं क्या कर सकता हूं, अगर मैं कर्सर को टेक्स्टबॉक्स पर डबल क्लिक या एक क्लिक से सेट करना चाहता हूं?WPF: CellEditingTemplate मैं डबल क्लिक करके आंतरिक नियंत्रण पर फ़ोकस कैसे सेट कर सकता हूं या

<Window x:Class="MultiLineEditDataGrid.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MultiLineEditDataGrid" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid DataContext="{Binding Source={x:Static Application.Current}, Path=CompanyManager}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="270"/> 
     <RowDefinition Height="30"/> 
    </Grid.RowDefinitions> 
    <DataGrid ItemsSource="{Binding Companies}" CanUserAddRows="False" AutoGenerateColumns="False"> 
     <DataGrid.Resources> 
      <DataTemplate x:Key="cellTemplate"> 
       <TextBlock Text="{Binding Description}"/> 
      </DataTemplate> 
      <DataTemplate x:Key="cellEditingTemplate"> 
       <local:MultiLineTextBox Text="{Binding Description}"/> 
      </DataTemplate> 
     </DataGrid.Resources> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Company" Binding="{Binding Name}"/> 
      <DataGridTemplateColumn Header="Description" 
            CellTemplate="{StaticResource cellTemplate}" 
            CellEditingTemplate="{StaticResource cellEditingTemplate}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Button Grid.Row="1" Content="Add" Command="{Binding AddCommand}"/> 
</Grid> 

MultiLineTextBox पाठ बॉक्स जो मैं पाठ बॉक्स से विरासत है, और विधि OnKeyDown ओवरराइड:

यहाँ मेरी कोड है।

MultiLineTextBox के कोड:

public class MultiLineTextBox : TextBox 
{ 
    /// <summary> 
    /// On Key Down. 
    /// </summary> 
    /// <param name="e"></param> 
    protected override void OnKeyDown (KeyEventArgs e) 
    { 
     base.OnKeyDown (e); 
     string oldText = Text; 
     ModifierKeys keys = Keyboard.Modifiers; 
     if (e.Key == Key.Enter) 
     { 
      if ((Keyboard.Modifiers & ModifierKeys.Control).Equals (ModifierKeys.Control)) 
      { 
       int index = SelectionStart; 
       oldText = oldText.Insert (index, Environment.NewLine); 
       Text = oldText; 
       Select (index + 1, 0); 
       e.Handled = true; 
      } 
      else 
      { 
       e.Handled = false; 
      } 
     } 
     else if (e.Key == Key.Escape) 
     { 
      Text = oldText; 
      e.Handled = false; 
     } 
    } 
} 

उत्तर

9

मैं इस समस्या को हल करने के लिए एक रास्ता खोजने, और यहाँ मेरे कोड है।

<Window x:Class="MultiLineEditDataGrid.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MultiLineEditDataGrid" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid DataContext="{Binding Source={x:Static Application.Current}, Path=CompanyManager}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="270"/> 
     <RowDefinition Height="30"/> 
    </Grid.RowDefinitions> 
    <DataGrid ItemsSource="{Binding Companies}" CanUserAddRows="False" AutoGenerateColumns="False"> 
     <DataGrid.Resources> 
      <DataTemplate x:Key="cellTemplate"> 
       <TextBlock Text="{Binding Description}"/> 
      </DataTemplate> 
      <DataTemplate x:Key="cellEditingTemplate"> 
       <local:MultiLineTextBox x:Name="multiLineTxt" Text="{Binding Description}"/> 
       <DataTemplate.Triggers> 
        <Trigger SourceName="multiLineTxt" Property="IsVisible" Value="True"> 
         <Setter TargetName="multiLineTxt" Property="FocusManager.FocusedElement" Value="{Binding ElementName=multiLineTxt}"/> 
        </Trigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </DataGrid.Resources> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Company" Binding="{Binding Name}"/> 
      <DataGridTemplateColumn Header="Description" 
            CellTemplate="{StaticResource cellTemplate}" 
            CellEditingTemplate="{StaticResource cellEditingTemplate}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Button Grid.Row="1" Content="Add" Command="{Binding AddCommand}"/> 
</Grid> 

8

मैं पता नहीं क्यों, लेकिन पिछले जवाब मेरे मामले में काम नहीं किया। मैंने पाया और वैकल्पिक समाधान यहां http://madcoderspeak.blogspot.ca/2010/04/set-keyboard-focus-when-user-begins.html

<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
     <StackPanel> 
      <TextBox x:Name="editCommentTextBox" Text="{Binding Comment, Mode=TwoWay}" 
        FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"> 
      </TextBox> 
      <Label Content="{Binding Text, ElementName=editCommentTextBox, Converter={StaticResource CharCounterConverter}}"/> 
     </StackPanel> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 
+1

स्वीकार्य उत्तर से सरल और मेरे लिए अच्छा काम किया। बहुत धन्यवाद। –

संबंधित मुद्दे