Подскажите, что нужно добавить в 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>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Не работает функция count()Она должна искать в массиве числа которые совпадают с введеным
Как при замене по регулярке в строке подстановки после группы $1 написать нечто, начинающееся с цифры, чтобы оно не стало частью номера группы?
Создаю копию объекта через Instantiate (у оригинала стоит Box-Collider) в итоге у копии компонент такой есть, но галочка почему-то снятаКак галочку поставить...
У меня есть двумерный массив целых чиселВ данном массиве есть точка входа [0,0] , а так же точка выхода [Length-1,Length-1]