Как правильно сообщить форме об изменениях( MVVM паттерн )

Я хочу, чтобы после дропа файла сюда:

В accounts показывало кол-во загруженных строк,но не знаю как правильно сделать через данный паттерн. Я думал сделать напрямую во View изменения, но это уже нарушение MVVM. Буду благодарен за любую помощь!!!

ViewModel/MainVM.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test.ViewModels
{
    class MainVM : INotifyPropertyChanged
    {
        private System.Collections.Concurrent.ConcurrentQueue<string> _accounts = default;
        private string _countOfBase = default;


        public string CountOfBase
        {
            get { return _countOfBase; }
            set 
            {
                if (_countOfBase == value)
                {
                    return;
                }
                OnPropertyChanged("CountOfBase");
                _countOfBase = value;
            }
        }

        public System.Collections.Concurrent.ConcurrentQueue<string> Accounts
        {
            get { return _accounts; }
            set {
                if (_accounts == value)
                {
                    return;
                }
                OnPropertyChanged("Accounts");
                _accounts = value;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

    }
}

Views/MainWindow.xaml:

<Window Name="WindowFile" Drop="WindowFile_Drop" 
        AllowDrop="true" x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WotBrute"
        mc:Ignorable="d"
        Title="Test" Height="450" Width="800"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
         TextElement.Foreground="{DynamicResource MaterialDesignBody}"
         TextElement.FontWeight="Regular"
         TextElement.FontSize="13"
         TextOptions.TextFormattingMode="Ideal"
         TextOptions.TextRenderingMode="Auto"
         Background="{DynamicResource MaterialDesignPaper}"
         FontFamily="{DynamicResource MaterialDesignFont}">
    <DockPanel>
        <ItemsControl DockPanel.Dock="Top">
            <DockPanel>
                <Button Width="200" HorizontalAlignment="Left" Content="START" Background="Black" BorderBrush="{x:Null}" Foreground="#DDFFFFFF"/>
                <ProgressBar Margin="5 2" Padding="5 5 5 5" Height="Auto" Minimum="0" Maximum="100" Value="1" Foreground="Black" FontFamily="Comic Sans MS" BorderBrush="Black">
                    <ProgressBar.Background>
                        <SolidColorBrush Color="#B2000000"/>
                    </ProgressBar.Background>
                </ProgressBar>
            </DockPanel>
        </ItemsControl>
        <ItemsControl DockPanel.Dock="Top">
            <Grid>
                <DataGrid x:Name="toDrop" AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn IsReadOnly="True" Header="123" Width="*"/>
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </ItemsControl>
        <ItemsControl x:Name="viewPanel" HorizontalAlignment="Center" VerticalAlignment="Bottom">
            <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom">
                <GroupBox Header="Accounts:" Margin="20" MinWidth="100">
                    <TextBlock HorizontalAlignment="Center" FontWeight="Bold" Text="{Binding Path=CountOfBase}"/>
                </GroupBox>
                <GroupBox Header="Proxy:" Margin="20" MinWidth="100">
                    <TextBlock HorizontalAlignment="Center" FontWeight="Bold">0</TextBlock>
                </GroupBox>
                <GroupBox Header="Goods:" Margin="20" MinWidth="100">
                    <TextBlock HorizontalAlignment="Center" FontWeight="Bold">0</TextBlock>
                </GroupBox>
                <GroupBox Header="Bads:" Margin="20" MinWidth="100">
                    <TextBlock HorizontalAlignment="Center" FontWeight="Bold">0</TextBlock>
                </GroupBox>
                <GroupBox Header="Exception:" Margin="20" MinWidth="100">
                    <TextBlock HorizontalAlignment="Center" FontWeight="Bold">0</TextBlock>
                </GroupBox>
            </StackPanel>
        </ItemsControl>
    </DockPanel>
</Window>

Views/MainWindow.xaml/MainWindow.xaml.cs:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Test.ViewModels;

namespace Test
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        MainVM mainVM = new MainVM();
        private BindingList<MainVM> uploadData = new BindingList<MainVM>();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void WindowFile_Drop(object sender, DragEventArgs e)
        {

            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // Note that you can have more than one file.
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                ConcurrentQueue<string> baseQueue = new ConcurrentQueue<string>();
                string tempLine = default;
                long countOfLines = 0;

                // Assuming you have one file that you care about, pass it off to whatever
                // handling code you have defined.

                try
                {
                    using(StreamReader reader = new StreamReader(new FileStream(files[0], FileMode.Open)))
                    {
                        while((tempLine = reader.ReadLine()) != null)
                        {
                            baseQueue.Enqueue(tempLine);
                            countOfLines++;
                        }
                    }
                }
                catch (Exception excep)
                {

                    MessageBox.Show(excep.Message);
                }

                uploadData.ListChanged += uploadData_ListChanged;
                uploadData = new BindingList<MainVM>() { new MainVM() { Accounts = baseQueue, CountOfBase = countOfLines.ToString() } };
                viewPanel.ItemsSource = uploadData;
            }
        }

        private void uploadData_ListChanged(object sender, ListChangedEventArgs e)
        {
            
        }
    }
}

После дропа файла не срабатывает уведомление и кол-во строк не записывается в Header="Accounts:"


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