EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:对自定义业务类使用通知(实施ISupportNotifications)

本示例演示如何将Notifications与自定义业务类相关联。

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=T177793)中提供了完整的示例项目。

注意
  • 本示例适用于Entity Framework数据模型。如果您使用XPO,请参阅“通知” | “通知”。“功能中心”演示中的“带有通知的自定义实体”示例。默认情况下,Feature Center演示安装在%PUBLIC%\ Documents \ DevExpress演示19.2 \ Components \ eXpressApp Framework \ FeatureCenter中。该演示的ASP.NET版本可从http://demos.devexpress.com/XAF/FeatureCenter/在线获得。
  • 移动应用程序不支持Notifications Module,因此本主题中描述的方法无法在Mobile平台中实现。请参阅如何使用Azure Notifications Hub KB向XAF Mobile应用程序发送推送通知,以了解如何在Mobile应用程序中使用推送通知。

假设您具有以下Task业务类。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using DevExpress.Persistent.Base;
// ...
[DefaultClassOptions]
 public class Task : INotifyPropertyChanged {
     private int id;
    [Browsable(false)]
    public int Id { get; private set; }

    private string subject;
    public string Subject { 
        get { return subject; } 
        set { SetProperty<string>(ref subject, value); } 
    }

    private DateTime dueDate;
    public DateTime DueDate { 
        get { return dueDate; }
        set { SetProperty<DateTime>(ref dueDate, value);}
    }

    protected void SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = null) {
        if(!EqualityComparer<T>.Default.Equals(field, value)) {
            field = value;
            OnPropertyChanged(propertyName);
        }
    }
    #region INotifyPropertyChanged members
    protected void OnPropertyChanged(string propertyName) {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

目的是使用通知模块提供的功能在DueDate时刻到来之前通知用户。请按照以下步骤操作:

  1. 使用模块设计器将该模块的组件添加到您的项目中:

    • NotificationsModule添加到您的Module项目。

      HowTo_Reminders_0

    • NotificationsModuleWeb添加到您的Module.Web项目。

      HowTo_Reminders_1

    • NotificationsModuleWin添加到您的Module.Win项目。

      HowTo_Reminders_2

    注意

    默认情况下,通知刷新间隔为5分钟。为了测试目的,您可以缩短此间隔。双击Win应用程序项目中的WinApplication.cs(vb)文件,在Module Designer的Modules部分中选择NotificationsModule。在“属性”窗口中,将NotificationsModule.NotificationsRefreshInterval设置为10秒。对Web应用程序项目中的WebApplication.cs(vb)文件执行相同的操作。

  2. 在Task类中实现ISupportNotifications接口。

    using DevExpress.Persistent.Base.General;
    // ...
    [DefaultClassOptions]
    public class Task : INotifyPropertyChanged, ISupportNotifications {
        // ...
    
        #region ISupportNotifications members
        private DateTime? alarmTime;
        [Browsable(false)]
        public DateTime? AlarmTime {
            get { return alarmTime; }
            set {
                SetProperty<DateTime?>(ref alarmTime, value);
                if (value == null) {
                    RemindIn = null;
                    IsPostponed = false;
                }
            }
        }
        private bool isPostponed;
        [Browsable(false)]
        public bool IsPostponed {
            get { return isPostponed;}
            set { SetProperty<bool>(ref isPostponed, value);}
        }
    
        [Browsable(false), NotMapped]
        public string NotificationMessage {
            get { return Subject; }
        }
    
        private TimeSpan? remindIn;
        public TimeSpan? RemindIn {
            get { return remindIn; }
            set { SetProperty<TimeSpan?>(ref remindIn, value); }
        }
    
        [Browsable(false), NotMapped]
        public object UniqueId {
            get { return Id; }
        }
        #endregion
    }
    
  3. 实现IXafEntityObject,以提供根据用户指定的RemindIn间隔初始化AlarmTime的逻辑。这是在OnSaving方法中实现的示例逻辑。

    using DevExpress.ExpressApp;
    // ...
    [DefaultClassOptions]
    public class Task : INotifyPropertyChanged, ISupportNotifications, IXafEntityObject {
        // ...
        #region IXafEntityObject members
        public void OnCreated() { }
        public void OnLoaded() { }
        public void OnSaving() {
            if(RemindIn.HasValue) {
                if((AlarmTime == null) || (AlarmTime < DueDate - RemindIn.Value)) {
                    AlarmTime = DueDate - RemindIn.Value;
                }
            }
            else {
                AlarmTime = null;
            }
            if (AlarmTime == null) {
                RemindIn = null;
                IsPostponed = false;
            }
        }
        #endregion
    }
    

运行WinForms或ASP.NET应用程序,并在过去创建一个新的过期任务DueDate应该早于当前时间)。用于指定一个非空值RemindIn属性指定的通知警报和之间的时间量DUEDATE力矩(空RemindIn值是指从未显示的警报)。

Notifications_CustomClass

保存任务,您将在通过NotificationsModule.NotificationsRefreshInterval属性或更短时间指定的时间跨度后看到“提醒”窗口。

HowTo_Reminders_5

相关文章

转载保留此链接,注明出处