Нумерация строк в dataGrid wpf

235
01 февраля 2018, 15:30

Здравствуйте, нашёл код который нумерует строки, попробовал собрать его, но когда я заполнил первую строку и нажатием на клавишу ENTER либо выйдя курсором из строки в которой происходило редактирование, следующая появляющаяся строка в которой должен появится следующий номер строки, почему-то сразу не создаёт следующий номер строки а создает предыдущий, подскажите пожалуйста, что я делаю неправильно? Спасибо.

<Window x:Class="НумерацияСтроквDataGrid.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:NumerRow="clr-namespace:НумерацияСтроквDataGrid"
        Title="MainWindow" Height="185.821" Width="525">
    <Window.Resources>
        <NumerRow:NumerRow x:Key="NumerRow"/>
    </Window.Resources>
    <Grid>
        <DataGrid x:Name="dataGrid1" HorizontalAlignment="Left" Height="117" 
                  Margin="26,10,0,0" VerticalAlignment="Top" Width="466" AutoGenerateColumns="False"
                  CanUserAddRows="True" CanUserDeleteRows="True" CanUserResizeColumns="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="№"
                                    Binding="{Binding Converter={StaticResource NumerRow},
                    Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"
                              ClipboardContentBinding="{x:Null}"/>
                <DataGridTextColumn Header="First" Binding="{Binding first}"/>
                <DataGridTextColumn Header="Second" Binding="{Binding second}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
namespace НумерацияСтроквDataGrid
{
    public class NumerRow : IValueConverter
    {
        public object Convert(object value, Type TargetType, object parameter, CultureInfo culture)
        {   
            DataGridRow row = value as DataGridRow;
            return row.GetIndex() + 1;
        }
        public object ConvertBack(object value, Type TargetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace НумерацияСтроквDataGrid
{
    public class Inform
    {
        public string first { get; set; }
        public string second { get; set; }
    }
}
Answer 1

Судя по всему, для пустой строки (которая фактически еще не существует в привязанной коллекции) DataGrid переиспользует один и тот же экземпляр DataGridRow, а конвертер для этой строки вызывается только один раз в самом начале работы программы, поэтому эта фиктивная строка всегда имеет один и тот же номер.

Воспользуемся тем, что у этой строки специфичный DataContext, а конкретно это некий internal-объект MS.Internal.NamedObject. Давайте просто проверим DataContext строки в конвертере:

DataGridRow row = value as DataGridRow;
if (row.DataContext?.GetType().FullName == "MS.Internal.NamedObject") return null;
return row.GetIndex() + 1;

Тогда у этой фиктивной строки вообще не будет выводиться номер, что, я считаю, приемлемым решением, т.к. этой строки фактически нет и в привязанной коллекции.

Да, это решение может перестать работать при изменениях внутри фреймворка, но это пока первое, что приходит в голову.

READ ALSO
Как отформатировать строку средствами c#

Как отформатировать строку средствами c#

ребята, получил SelectSingleNode в переменную типа string вот в таком виде

204
Методы класса Parallel

Методы класса Parallel

Рихтер пишет:

243
Как добавить окончание .html к URL-адресу ASP.NET MVC 5?

Как добавить окончание .html к URL-адресу ASP.NET MVC 5?

Нужно добавить окончаниеhtml для URL-адресов в ASP

194
Соединение 2х устройств в одной сети WiFi

Соединение 2х устройств в одной сети WiFi

Здравстуйте! Есть tcplistener на компьютере, и tcpclient на android смартфонеОба устройства подключены к 1 сети wifi (к компьютеру кабель от роутера, а телефон...

223