2015-07-02 7 views
0

Я новичок в WPF и MVVM. Я ищу USB-устройства в своей программе. Но если я подключу новое устройство, необходимо перезапустить программу, чтобы она стала видимой.Список наблюдения ObservableCollection

Как это сделать, что немедленно обновить.

В настоящее время у меня в классе, в котором я ищу устройства это:

public List<Devices> devices = new List<Devices>(); 

    public void FindDevices() // spremeni v public bool da dobis feedback 
    { 


     _deviceList = HidDevices.Enumerate(VendorID, ProductID).ToArray(); 

...  devices.Add(new Devices() 
      { 
       DeviceId = nod + 1, 
       ManufacturerId = deviceManufacturerstring[nod], 
       ProductId = deviceProductstring[nod], 
       SerialNumberId = deviceSNstring[nod], 
       HardwareVersionId = "test4", 
       FirmwareVersionId = "test5", 
       DateOfManufaturedId = "test6" 

      }); 

На отверстие для петли добавить устройство в список. Мне нужен цикл, потому что я читаю некоторые данные с каждого устройства.

я потом добавить эти устройства в списке в ViewModel:

public class Windows1ViewModel : ViewModelBase 
{ 
    public ObservableCollection<Devices> devfuck { get; protected set; } 
    List<Devices> _devicelist; 

    public List<Devices> Devices 
    { 
     get { return _devicelist; } 
     set { _devicelist = value; } 
    } 

    public Windows1ViewModel() 
    { 

     USBmiddleware cs = new USBmiddleware(); 
     cs.FindDevices(); 


     devfuck = new ObservableCollection<Devices>(); 


     foreach (var item in cs.devices) 
     { 
      devfuck.Add(item); 
     } 

     List<Devices> keks = cs.devices; 



     NotifyPropertyChanged("devfuck"); 
    } 


    public List<Devices> lvdevices 
    { 
     get { return _devicelist; } 
     set { _devicelist = value; } 
    } 

Что изменить? Где добавить INotifyPropertyChanged? Или как решить мою проблему? Обратитесь за помощью. Благодаря!

Мои ViewModelBase

public class ViewModelBase : INotifyPropertyChanged, IDisposable 
{ 


    protected ViewModelBase() 
    { 
    } 



    #region DisplayName 


    public virtual string DisplayName { get; protected set; } 

    #endregion // DisplayName 

    #region Debugging Aides 


    [Conditional("DEBUG")] 
    [DebuggerStepThrough] 
    public void VerifyPropertyName(string propertyName) 
    { 
     // Verify that the property name matches a real, 
     // public, instance property on this object. 
     if (TypeDescriptor.GetProperties(this)[propertyName] == null) 
     { 
      string msg = "Invalid property name: " + propertyName; 

      if (this.ThrowOnInvalidPropertyName) 
       throw new Exception(msg); 
      else 
       Debug.Fail(msg); 
     } 
    } 


    protected virtual bool ThrowOnInvalidPropertyName { get; private set; } 



    public event PropertyChangedEventHandler PropertyChanged; 


    /// <param name="propertyName">The property that has a new value.</param> 
    protected virtual void NotifyPropertyChanged(string propertyName) 
    { 
     this.VerifyPropertyName(propertyName); 

     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 

    protected virtual void NotifyPropertyChangedAll(object inOjbect) 
    { 
     foreach (PropertyInfo pi in inOjbect.GetType().GetProperties()) 
     { 
      NotifyPropertyChanged(pi.Name); 
     } 
    } 
    public virtual void Refresh() 
    { 
     NotifyPropertyChangedAll(this); 
    } 



    public void Dispose() 
    { 
     this.OnDispose(); 
    } 

    /// <summary> 
    /// Child classes can override this method to perform 
    /// clean-up logic, such as removing event handlers. 
    /// </summary> 
    protected virtual void OnDispose() 
    { 
    } 



    ~ViewModelBase() 
    { 
     string msg = string.Format("{0} ({1}) ({2}) Finalized", this.GetType().Name, this.DisplayName, this.GetHashCode()); 
     System.Diagnostics.Debug.WriteLine(msg); 
    } 


} 
+0

Я думаю, что ваше свойство 'devfuck' должно быть« Свойством зависимостей »http://stackoverflow.com/questions/617312/what-is-a-dependency-property – Ralt

+0

Когда вызывается' FindDevices() '? –

+0

Попробуйте добавить таймер, который вызывает cs.FindDevices(), когда-либо, как часто вам нужен список, который нужно обновить. – Johan

ответ

2

Вы можете сделать это, используя таймер, который вызывается так часто (по мере необходимости). Конечно, было бы сексуальнее, если вы могли бы сделать это с помощью управления событиями ...

К счастью, есть способ сделать это:

var watcher = new ManagementEventWatcher(); 
var query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE  EventType = 2"); 
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); 
watcher.Query = query; 
watcher.Start(); 

, как указано здесь: Detecting USB drive insertion and removal using windows service and c#

Вы можете подписаться к событию и назовите ваш

FindDevices() 

Оттуда.

+0

Спасибо. Я попробую – Pukaai

+0

И как удалить событие? Где разница? – Pukaai

+0

Теперь, когда мне нравится называть FindDevice(), показать ошибку: «Ошибка \t 2 Нет перегрузки для метода FindDevices« принимает 0 аргументов ». Что я должен исправить? – Pukaai

0

Вы должны реализовать INotifyPropertyChanged interface в вашем Windows1ViewModel классе. Затем вам нужно вызвать его из вашего средства настройки свойств или после того, как вы установите свойство, как вы сейчас делаете.

Далее вы должны настроить DispatcherTimer, чтобы позвонить вам FindDevices так часто, а затем обновить свойство ObservableCollection.

+0

Спасибо. Я обновляю свой пост. ViewModelBase уже vontain INotifyPropertyChanged – Pukaai