从另一个班级获取通知

时间:2014-01-16 10:23:32

标签: c# wpf notifications

我有一个WPF应用程序,它显示一个包含各种信息的窗口。在我的代码中,我创建了一个我创建的自定义类的实例,它从RFID读卡器读取信息。为了保持简单 - 有时会有人使用读卡器刷卡,这会生成我使用自定义类成功捕获的字符串。

我遇到的问题是我需要将该值返回给窗口应用程序,以便我可以根据读取的值更新窗口中显示的信息。这不像在自定义类中调用函数并返回值那么简单,因为我不知道何时会有人刷卡。

我能想到的一个解决方案是制作计时器并每隔一秒左右汇集自定义类,以检查是否有人刷卡,但是,我认为这不是一个有效的解决方案。

由于我对WPF相对较新,我假设正确的方法是使用INotifyProperyChanged,但我不确定如何做到这一点。也欢迎任何其他建议,谢谢!

3 个答案:

答案 0 :(得分: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));
            }
        }
    }

答案 1 :(得分: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.

}

在课堂上订阅活动并做必要的事情。

答案 2 :(得分:0)

谢谢大家的帖子。使用事件绝对是方法,但要理解它们是如何工作的并不容易。您的反馈肯定有帮助,但本文帮助我了解事件如何最有效以及如何实现它们,以便我可以成功地处理问题: http://www.codeproject.com/Articles/9355/Creating-advanced-C-custom-events