2014-01-16 50 views
0

我有一個WPF應用程序,它顯示一個包含各種信息的窗口。在我的代碼中,我創建了一個自定義類的實例,該實例從RFID讀卡器讀取信息。爲了保持簡單 - 每隔一段時間,有人會使用讀卡器刷卡,這會生成一個字符串,我可以使用自定義類成功捕獲該字符串。從另一個類獲取通知

我的問題是我需要將該值返回給窗口應用程序,以便根據讀取的值更新窗口中顯示的信息。這不像調用自定義類中的函數那樣簡單,並且返回一個值,因爲我不知道何時會有人刷卡。

我能想到的一個解決方案是製作一個計時器並每隔一段時間彙集自定義類來檢查是否有人刷卡,但是,我認爲這不是一個有效的解決方案。

因爲我對WPF比較陌生,我假設正確的方法是使用INotifyProperyChanged,但我不確定如何去做。打開任何其他建議,謝謝!

+2

這是一個使用事件的完美示例,在您的自定義類中實現CardSwiped事件你訂閱的。當刷卡時,你提出事件。 – Zache

+0

只要同一張卡片不止一次刷卡生成*不同的字符串(例如帶時間戳等),您還可以擁有一個字符串屬性,該字符串屬性會觸發'INotifyProperyChanged.PropertyChanged'事件。然後,您的讀卡器類將立即可用作WPF數據綁定的源。 – Clemens

+0

或者如果它始終來自同一張卡片的相同字符串,則可以創建一個結構化類型的屬性,其中包含字符串和一些更改數據(例如,時間戳。 – Clemens

回答

0

在從RFID讀取數據的類上創建事件。

public class CardSweepedEventArgs : EventArgs { 
private readonly string _data; 

public string Data { get { return _data; } } 

public CardSweepedEventArgs(string data) { 

    _data = data; 

    } 
} 

public class YourReadinClass { 

public EventHandler<CardSweepedEventArgs> CardSweeped; 

// rest of logic. 

} 

在你的類,然後訂閱事件,並做了必要的。

1

在您的CardReader類上創建一個可以在您的ViewModel上聆聽的事件。

class CardInfo 
    { 
     public string CardDetails { get; set; } 
    } 

    class CardSwipedEventArgs 
     : EventArgs 
    { 
     public CardInfo SwipedCard { get; set; } 
    } 

    interface ICardReader 
    { 
     event EventHandler<CardSwipedEventArgs> CardSwiped; 
    } 

    class MyViewModel : INotifyPropertyChanged 
    { 
     private ICardReader _cardReader; 

     private string _lastCardSwiped; 

     public ICardReader CardReader 
     { 
      get 
      { 
       return _cardReader; 
      } 
      set 
      { 
       _cardReader = value; 
       _cardReader.CardSwiped += OnCardSwiped; 
      } 
     } 

     private void OnCardSwiped(object sender, CardSwipedEventArgs e) 
     { 
      LastCardSwiped = e.SwipedCard.CardDetails; 
     } 

     public string LastCardSwiped 
     { 
      get 
      { 
       return _lastCardSwiped; 
      } 
      set 
      { 
       _lastCardSwiped = value; 
       this.OnPropertyChanged("LastCardSwiped"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = this.PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    }