C# wpf как сделать автозаполнение поля с возможностью редактирования

Есть база данных с двумя таблицами. Мой вопрос затронет только вторую таблицу. И так в этой таблице 5 столбцов, см. картинку введите сюда описание изображения В DataGrid UserContol'a отображаются только строки сплошной линией. Поле Number должно заполняться автоматически начиная с 001, но если щёлкнуть по полю , номер должен стереться и можно будет указать свой номер. При чем после отправки номер должен увеличиваться от последнего на один. Пример: 001, 002, 003, 009 следующий 010. А если удалим строку , то номер также от последнего. Пример удалили строку с номером 010 ( в поле 010) , далее удаляем строчку 009 (в поле 004). Пока мне удалось реализоваться автозаполнение и прибавление. Вот код (string на int я потом поправлю мне бы понять как сделать). ViewModel (UserControl2VM)

 private ObservableCollection<DataModel> сollection;
 public ObservableCollection<DataModel> MyСollection
 {
     get { return сollection; }
     set { Set(ref сollection, value); }
 }

private string number1;
public string Number1
{
    get {
        using (CotextModel db = new ContextModel())
        {
            string numDb = (from value in db.dbTable where value.idKey2 == idReport orderby value.number descending  select value.number).FirstOrDefault();
            if (numDb == null) return number1 = "001";
            int number1 = int.Parse(numDb) + 1;
            return number1 = Convert.ToString(number1).PadLeft(3, '0');
        }
    }
    set
    {
        if (!string.Equals(number1, value))
        {
            number1 = value;
            OnPropertyChanged("Number1");
           
        }
    }
}

Тут я получаю Number1 и вывожу его во View

<TextBox Text="{Binding Number1, UpdateSourceTrigger=PropertyChanged}"/>

И команда для отправки в БД

//Команда добавления данных в таблицу dbTable и в коллекцию
public ICommand SaveDataCommand { get; set; }
private bool CanSaveDataExecute(object commandParameter) => true;
private void OnSaveDataExecuted(object commandParameter)
{
    //indexIdReport = Convert.ToInt32(commandParameter);

    MyDataModel myDataModel = new MyDataModel
    {
        idkey2 = IdReport,
        number1 = Number1,
        name = Name,
        data = MyNewData,     
    };
    //добавляем данные в БД
    ContextData.AddToDb(myDataModel);
    //добавляем данные в коллекцию
    сollection.Add(myDataModel); 
    number1= (int.Parse(number1) + 1).ToString().PadLeft(3, '0');
    name = string.Empty;
    mydata = string.Empty;
}
...

...
 public UserControl2VM()
 {
     //Команда удаления строки
     DeleteCommand = new LambdaCommand(OnDeleteExecuted, CanDeleteExecute);
     //Команда добавления 
     SaveDataCommand = new LambdaCommand(OnDataQsoExecuted, CanDataQsoExecute);
     //Rоллекцию
     MyСollection = new ObservableCollection<DataModel>(MyData.GetAllData().Where(p => p.idRkey2 == idReport));
 }


У меня получается заполнять поле, при нажатии на кнопку Отправить, данные заносятся в БД, появляется в DataGrid, все заполненные ранее в полях TextBox стираются, а в TextBox Number1 появляется число большее от предыдущего на 1. Но дальше ничего не получается, если удалю одну строку в DataGrid (в коллекции и в БД удаляется), а номер остается тот же который и был до удаления строки. Также не получается изменить Number1 при клике по полю, не знаю как применить UpdateSourceTrigger=Explicit Пока тут писал вопрос, понял почему при удалении не изменялся номер, надо было к команде удаления добавить тот же код, который при добавлении использовался number1 = (int.Parse(namber1) + 1).ToString().PadLeft(3, '0'); Теперь при удалении меняется номер на следующий. Остается только вопрос как изменить значение поля при клике по полю. Я пробовал Mode=OneWay с ним можно менять поле, но запишется то значение, которое там было до изменения. По-моему тут как-то элементарно все делается, но я пока не вижу решения. Пока все мои познания с# на уровне "Зашел с улицы посмотреть, что тут делают" :) .


Ответы (1 шт):

Автор решения: Rustam

В комментариях подсказали ответ.

Строка бендинга теперь такая.

<TextBox Text="{Binding Number1, Mode=TwoWay}"/>

ViewModel в get к Number1 добавил проверку:

public string Number1
{
    get {
        if (number1 != null) return number1; // Добавил
        using (CotextModel db = new ContextModel())
        {
            string numDb = (from value in db.dbTable where value.idKey2 == idReport orderby value.number descending  select value.number).FirstOrDefault();
            if (numDb == null) return number1 = "001";
            int number1 = int.Parse(numDb) + 1;
            return number1 = Convert.ToString(number1).PadLeft(3, '0');
        }
    }
    set
    {
        if (!string.Equals(number1, value))
        {
            number1 = value;
            OnPropertyChanged("Number1");
           
        }
    }
}

Теперь все работает. Всем спасибо.

→ Ссылка