Как редактировать в DataGridTemplateColumn WPF

184
02 января 2019, 17:10

Подскажите, что нужно добавить в 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;
    }
}
Answer 1

Вам по сути нужен 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>
READ ALSO
Не рабоает count()

Не рабоает count()

Не работает функция count()Она должна искать в массиве числа которые совпадают с введеным

168
Как отделить группу от цифр?

Как отделить группу от цифр?

Как при замене по регулярке в строке подстановки после группы $1 написать нечто, начинающееся с цифры, чтобы оно не стало частью номера группы?

174
Как добавить box collider через код

Как добавить box collider через код

Создаю копию объекта через Instantiate (у оригинала стоит Box-Collider) в итоге у копии компонент такой есть, но галочка почему-то снятаКак галочку поставить...

183
C# генерация случайного пути

C# генерация случайного пути

У меня есть двумерный массив целых чиселВ данном массиве есть точка входа [0,0] , а так же точка выхода [Length-1,Length-1]

171