Подскажите, что нужно добавить в DataGridTemplateColumn, чтобы курсор когда пытаешься отредактировать в ячейке не приходилось нажимать три раза, а после редактирования ячейки, при переходе на новую строку курсор, чтобы курсор встал в новой ячейке.
<Grid>
<DataGrid x:Name="DGR" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid x:Name="Grid">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="Введите имя: " x:Name="textBlock" Visibility="Collapsed" Foreground="Gray"/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Name}" Value="{x:Null}">
<Setter TargetName="Grid" Property="Background" Value="Transparent" />
<Setter TargetName="textBlock" Property="Visibility" Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
class Person
{
public string Name { get; set; }
public string SecondName { get; set; }
}
public partial class MainWindow : Window
{
ObservableCollection<Person> people = new ObservableCollection<Person>();
public MainWindow()
{
InitializeComponent();
DGR.ItemsSource = people;
}
}
Вам по сути нужен DataGridTextColumn, но с некоторым нестандартным поведением (нестандартным шаблоном в обычном режиме), предлагаю вам следующее решение.
Выносим этот нестандартный шаблон в ресурсы окна (в дальнейшем вы можете вынести его в отдельный словарь ресурсов):
<Window.Resources>
<ControlTemplate x:Key="CellTemplate">
<Grid x:Name="Grid">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="Введите имя: " x:Name="textBlock" Visibility="Collapsed" Foreground="Gray"/>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Name}" Value="{x:Null}">
<Setter TargetName="Grid" Property="Background" Value="Transparent" />
<Setter TargetName="textBlock" Property="Visibility" Value="Visible"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
И пишем такого наследника DataGridTextColumn:
public class MyDataGridTextColumn : DataGridTextColumn
{
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
// Хак для того, чтобы не падал дизайнер
if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
return base.GenerateElement(cell, dataItem);
// Берем текущее окно
var window = Window.GetWindow(cell);
// Находим в ресурсах шаблон
var template = (ControlTemplate)window.Resources["CellTemplate"];
// Создаем контрол с этим шаблоном
var control = new Control { Template = template };
return control;
}
}
Ну и теперь можно написать так:
<DataGrid x:Name="DGR" AutoGenerateColumns="False">
<DataGrid.Columns>
<local:MyDataGridTextColumn Header="Name" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
Сборка персонального компьютера от Artline: умный выбор для современных пользователей