2011-02-14 3 views
6

CellEditingTemplate을 사용하여 DataGrid의 usercontrol을 작성했습니다. 이 편집 템플릿의 DataTemplate은 TextBox이며 커서를 세 번 클릭하여 텍스트 상자로 이동합니다. 두 번 클릭하거나 한 번 클릭하여 텍스트 상자에 커서를 설정하려면 어떻게해야합니까?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에 오버라이드 (override) :

여기 내 코드입니다.

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

허용되는 답변보다 단순하며 나에게 잘 맞습니다. 많은 감사합니다. –