Здравствуйте, нашёл код который нумерует строки, попробовал собрать его, но когда я заполнил первую строку и нажатием на клавишу 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; }
}
}
Судя по всему, для пустой строки (которая фактически еще не существует в привязанной коллекции) 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;
Тогда у этой фиктивной строки вообще не будет выводиться номер, что, я считаю, приемлемым решением, т.к. этой строки фактически нет и в привязанной коллекции.
Да, это решение может перестать работать при изменениях внутри фреймворка, но это пока первое, что приходит в голову.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
ребята, получил SelectSingleNode в переменную типа string вот в таком виде
Нужно добавить окончаниеhtml для URL-адресов в ASP
Здравстуйте! Есть tcplistener на компьютере, и tcpclient на android смартфонеОба устройства подключены к 1 сети wifi (к компьютеру кабель от роутера, а телефон...