Неправильно работает привязка свойств PictureBox и моего класса

Работаю над прогой на WinForms.

Суть работы в следующем:

  1. Открываю картинку или несколько
  2. Выбираю картинку из списка filesListBox
  3. Выделяю фрагмент на картинке originalPicBox прямоугольником
  4. Выделенный фрагмент отрисовывается в отдельном fragmentPicBoxе
  5. По нажатию кнопки на форме происходит распознавание текста на картинке и вывод текста в recognRichTBox

Использую привязки объекта PlotResult к контролам формы чтобы обновлять состояние объекта.

public class PlotResult : INotifyPropertyChanged
{
    private Image _originalImg;
    private Image _cropImg;
    private string _recognizedText;

    public event PropertyChangedEventHandler PropertyChanged;

    public Image OriginalImg {
        get 
        {
            return _originalImg;
        }
        set 
        {
            if (value != _originalImg)
            {
                _originalImg = value;
                NotifyPropertyChanged();
            }
        }
    }
    public Image CropImg {
        get 
        {
            return _cropImg;
        }
        set
        {
            if (value != _cropImg)
            {
                _cropImg = value;
                NotifyPropertyChanged();
            }
        }
    }

Объекты храняться в коллекции

  BindingList<PlotResult> plotResults = new BindingList<PlotResult>();

Код формы с привязками

public MainForm()
    {
        InitializeComponent();
        
        //Data bindings
        filesListBox.DataSource = plotResults;
        originalPicBox.DataBindings.Add(new Binding("Image", plotResults, "OriginalImg", true, DataSourceUpdateMode.OnPropertyChanged));
        fragmentPicBox.DataBindings.Add(new Binding("Image", plotResults, "CropImg", true, DataSourceUpdateMode.OnPropertyChanged));
        recognRichTBox.DataBindings.Add(new Binding("Text", plotResults, "RecognizedText", true, DataSourceUpdateMode.OnPropertyChanged));
    }

Прямоугольник выбора отрисовывается при движении мыши с нажатой ЛКМ. Картинка фрагмента вырезается при событии MouseUp, полный код

 private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if (pictureLoaded && selecting)
        {
            Image cropImg = null;
            selecting = false;
            mouseDown = false;
            
            Bitmap originalPic = (Bitmap)originalPicBox.Image;
            try
            {
                cropImg = originalPic.Clone(crop, System.Drawing.Imaging.PixelFormat.DontCare);
                fragmentPicBox.Image = cropImg;
            }
            catch (Exception ex)
            {
                //Какая-то обработка исключения
            }
        }
    }

Проблема в следующем: если пройти по алгоритму, как я указал выше, текст распознается, но картинка вырезанного фрагмента исчезает после добавления текста в recognRichTBox. Если после выделения прямоугольником перейти на другую картинку, а потом вернувшись запустить распознавание, все работает как нужно.

Код метода распознавания не привожу, т.к. проблема КМК именно в MouseUp ивенте. Картинка не записывается в свойство CropImg. Пробовал там же писать рандомный текст в recognRichTBox - текст записывается, а картинка нет и исчезает из fragmentPicBox. Несколько раз переписывал и привязки и что только можно, в итоге окончательно запутался.

UPD код кнопки распознавания

private void recognizeBtn_Click(object sender, EventArgs e)
    {
        try
        {
            if (fragmentPicBox.Image == null)
            {
                throw new Exception("Не выбран фрагмент файла");
            }
            else
            {
                Recognizer recognizer = new Recognizer(@"путь к файлу с моделью");
                if (region != Rectangle.Empty)
                {
                    (string recognizedText, bool succed) = recognizer.RecognizeIt((Bitmap)fragmentPicBox.Image);

                    if (succed)
                    {
                        toolStripProgressBar.PerformStep();
                    }
                    recognRichTBox.Text = recognizedText;
                }
            }
        }
        catch (Exception ex)
        {
            //Какая-то обработка исключения
        }
    }

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

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

Конкретно моя проблема решается заменой DataSourceUpdateMode.OnPropertyChanged на DataSourceUpdateMode.OnValidation в привязках.

originalPicBox.DataBindings.Add(new Binding("Image", plotResults, "OriginalImg", true, DataSourceUpdateMode.OnPropertyChanged));
fragmentPicBox.DataBindings.Add(new Binding("Image", plotResults, "CropImg", true, DataSourceUpdateMode.OnPropertyChanged));
recognRichTBox.DataBindings.Add(new Binding("Text", plotResults, "RecognizedText", true, DataSourceUpdateMode.OnPropertyChanged));

Но мне по-прежнему непонятно почему при обновлении свойства Image контрола fragmentPicBox не происходит обновление свойства CropImg объекта PlotResult.

OnPropertyChanged - Источник данных обновляется при каждом изменении свойства элемента управления.

OnValidation - Источник данных обновляется при проверке свойства элемента управления. После проверки значение свойства элемента управления также будет переформатировано.

→ Ссылка