Список процессов не обновляется если я напрямую бинжу к Process.GetProcesses() через ObjectDataProvider

191
17 июня 2018, 12:30

Есть задача, написать диспетчер задач на с# с патерном mvvm. У меня возникла проблема с привязкой. Фишка в том что если я напрямую бинжу к Process.GetProcesses() через ObjectDataProvider то список процессов не обновляется. Проблема в обновлении именно. Подскажите,как его привязать правильно? Еще интересно, как его можно отсортировать? Ну, список. Не нарушая mvvm.

Answer 1

Если вы планируете через свою программу убивать процессы, то вам нужно использовать не List<string> как у меня, а ObservableCollection<string> и еще добавить свойство для SelectedItem.

public class MainViewModel : INotifyPropertyChanged, IDisposable
{
    public event PropertyChangedEventHandler PropertyChanged;

    private Timer _timer;
    //ctor
    public MainViewModel()
    {
        LoadProcesses();
        RunTimer();
    }
    private List<string> _Processes = new List<string>();
    public List<string> Processes
    {
        get => _Processes;
        set
        {
            _Processes = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Processes)));
        }
    }

    private void RunTimer()
    {
        _timer = new Timer();
        _timer.Interval = 2000;
        _timer.Elapsed += _timer_Elapsed;
        _timer.Start();
    }
    private void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        LoadProcesses();
    }
    private void LoadProcesses()
    {
        var ps = Process.GetProcesses()
                        .Select(p => p.ProcessName)
                        .OrderBy(n => n)
                        .Distinct()
                        .ToList();
        Processes = ps;
    }
    public void Dispose()
    {
        _timer.Stop();
        _timer.Dispose();
    }
}
Answer 2

Рабочим решением будет использовать Dispatcher Timer

Пример:

 public class ViewModel : INotifyPropertyChanged
 {
     private DispatcherTimer changeTimer;
       ViewModel ()
      { 
       changeTimer = new DispatcherTimer...
       changeTimer.Tick += Tick;
       changeTimer.Interval = TimeSpan.FromSeconds(1);
  }
  private ObservableCollection<Model> items;
  public ObservableCollection<Model> Items 
  {
    get  
    {
        return items;
    }
    set
    {
        if(value != items)
        {
          items = value;
          NotifyPropertyChanged("Items"); 
          changeTimer.Start();
        }
    }
  }
 private void LoadData()
 {
     Items = // здесь загружаем данные
  }
  private Tick(...)
  {
     LoadData();
  }
 }
READ ALSO
Не компилятся шейдеры. Краш при попытке просмотра лога

Не компилятся шейдеры. Краш при попытке просмотра лога

Я подгрузил в свою программу 2 шейдера:

200
Разные DataGridView, одинаковые имена колонок

Разные DataGridView, одинаковые имена колонок

Есть 2 разных dataGridView, можно ли что бы они содержали одинаковые имена колонок?

191
Visual Studio 2015 ошибка при остановке отладчика

Visual Studio 2015 ошибка при остановке отладчика

Описание проблемы: подключаюсь через RDP к удаленному серверу, на этом сервере запускаю студию Visula Studio 2015, запускаю отладчик и при каждой остановки...

211
Какие есть генераторы документации для SignalR core?

Какие есть генераторы документации для SignalR core?

Нужен генератор документации в проекте AspNet

160