xamSchedule ソリューションの使用方法

0 ユーザーが評価
この投稿には確認済みの回答があります。 0 返信 | 1 サポーター

トップ 10 投稿者 
男性
投稿 12
IG Employee
セドリック 投稿済み: 2010/11/26 16:22

元記事 (英語): Mihail Mateev - http://forums.infragistics.com/blogs/mihail_mateev/archive/2010/10/25/how-to-use-infragistics-xamschedule-solution.aspx

xamSchedule ソリューションは、NetAdvantage 2010 Volume 3 に含まれます。このスケジュール コンポーネントは Silverlight および WPF に対応しており、Silverlight の xamSchedule は NetAdvantage for Silverlight Line of Business 2010 Volume 3、WPF の xamSchedule は NetAdvantage for WPF Line of Business 2010 Volume 3 に含まれています。

また、上記 2 製品は NetAdvantage for .NET 2010 Volume 3 および NetAdvantage Ultimate 2010 Volume 3 に含まれます。

この記事では、Silverlight 用の xamSchedule ソリューションについてご紹介します。ご存じのように Silverlight および WPF の xamSchedule は同じ API を使用しています。ただし、Silverlight と WPF のフレームワークは多少異なるため使用方法が変わる場合があります。

xamSchedule アーキテクチャ

xamSchedule ソリューションは Microsoft™ Outlook™ 予定表のほとんどの機能を再現できます。コードをほとんど書かずに色々なビューでアクティビティ情報を表示することができます。また、複数のカレンダーに複数のリソースを同時に表示することも可能です。

ソリューションは、UI 要素 (ビュー)、データ マネージャー コントロールおよびデータ コネクターを含みます。

ビュー:

xamDayView、xamScheduleView、および xamMonthView、3 つのビューがあります。1 つ以上のリソースに対する予定表によるアクティビティを表示およびコントロールすることが可能になります。

DataManager:

DataManager クラスはビューにデータ (リソース、予定表、およびアクティビティ) を提供します。稼働日、稼働時間、ユーザー操作の設定などのプロパティを公開します。

データ コネクター:

データ コネクターは表示されない要素で、スケジュール データ (リソース、予定表、およびアクティビティ) にバインドするために使用します。各データ コネクターがデータ マネージャーに関連づけられ、データ マネージャーが各ビュー コントロールにデータを提供します。

以下のデータ コネクターが提供されます。

  • ListScheduleDataConnector
  • WcfScheduleDataConnector

List および WcfScheduleDataConnector クラスは、データ ソース オブジェクトと xamSchedule オブジェクト間のプロパティのマッピングをサポートします (リソース、予定表、およびアクティビティ)。

ListScheduleDataConnector は、XamScheduleDataManager とスケジュール データ ソース間のコネクターとして使用される非視覚型の要素です。これはスケジュール データ マネージャーに提供されるビュー モデル オブジェクト (リソース、カレンダーおよびアクティビティ) を作成します。コネクターを IEnumerable 項目ソースのセットにバインドできます。xamScheduleManager は、ユーザー インターフェイスでデータを操作し、要求をデータ コネクターへ順にダイレクトします。データ コネクターは基本項目ソースに行われた変更を認識します。

スケジュール ユーザー インターフェイスがオンデマンドでデータに簡単にアクセスできない場合は WcfScheduleDataConnector を使用します。データベースのすべてのスケジュール データをサーバーからクライアントへ送信するのは実用的ではありません。WCF リスト コネクターは、サーバー上の IEnumerable コレクションを受け付けるサービスと通信し、クライアントによって要求されるスケジュール データだけを返します。
クライアント側では、WcfScheduleDataConnector は ListScheduleDataConnector と同じように XamScheduleDataManager と動作します。DataConnector プロパティを WcfListScheduleDataConnector インスタンスに設定し、コネクターにリモート WCF サービスの位置を報告する必要があります。

また、特定な要件に沿ったスタム データ コネクターの作成も可能です。
データ コネクターは特定なタイムゾーン情報にも対応します。



 

 

サンプル xamSchedule アプリケーション:


このデモ アプリケーションでは、xamSchedule スイートの使用方法を紹介します。まず、適切な DataConnector 設定してください。

このサンプルでは、ListScheduleDataConnector を利用しています。このソリューションでは、Resources (ユーザー)、ResourceCalendars (予定表) および Appointments (予定) のカスタム コレクションを提供する ViewModel を作成します。ViewModel はさまざまなソースからデータを取得することができます。このデモでは xamSchedule スイートにフォーカスしているため、スケジュール データ ソースのサーバー側ストレージは実装しません。

要件:

  • Visual Studio 2010
  • Silverlight 4 Tools for Visual Studio 2010
  • Silverlight 4 Toolkit
  • 以下製品のうち 1 つ:
    1. NetAdvantage for Silverlight  Line of Business 2010 Vol.3
    2. NetAdvantage for .NET 2010 Vol.3
    3. NetAdvantage Ultimate 2010 Vol.3 

 


デモ アプリケーションの作成ステップ

  • Silverlight アプリケーションを作成します。
  • Resources、ResourceCalendars、および Appointments にメンバーを持つ ViewModel を作成します。
  • ListScheduleDataConnector を追加し、マッピング フィールドを設定します。
  • xamScheduleDataManager を追加します。
  • xamDayView、xamScheduleView、および xamMonthView、スケジュール スイートから UI コンポーネントを追加します。
    複数予定表のサポートを実装します。
  • 予定表表示モードのためのランタイム サポートを実装します。
  • 現在の xamSchedule 設定の永続化を実装します。
    TimeZone オプションを処理します。
  • Silverlight アプリケーションを作成します。

SilverlightXamScheduleApp という名前の Silverlight アプリケーションを作成
Silverlight アプリケーションを ASP.NET ウエブ アプリケーションにホストする必要はありません。デモはビュー、xamScheduleDataManager、および ListScheduleDataConnector に対する xamSchedule 機能を公開します。

Resources、ResourceCalendars、および Appointments にメンバーを持つ ViewModel を作成

ResourceInfo、ResourceCalendarInfo、および AppointmentInfo クラスを作成します。xamSchedule スイートの Resource、ResourceCalendar、および Appointment クラスに必要なプロパティによって、このクラスはプロパティを公開します。 このサンプルでは、ViewModel に公開されるデータ ソースようのカスタム クラスがあります。

ListScheduleDataConnector および WcfScheduleDataConnector クラスは、データ ソース オブジェクトと xamSchedule オブジェクト間のプロパティのマッピングをサポートします (Resources、Calendars および Activities など)。これは、オンラインヘルプ「バックエンド データ ソースでフィールドをマップ」で説明しています。

以下はデータ ソース クラスのコードです。

ResourceInfo クラス:

 

1: public class ResourceInfo : BaseViewModel

2: {




3: 




4: #region Properties




5: 




6: #region DaySettingsOverrides




7: private string _daySettingsOverrides;




8: 




9: public string DaySettingsOverrides




10: {




11: get { return _daySettingsOverrides; }




12: set




13: {




14: _daySettingsOverrides = value;




15: OnPropertyChanged("DaySettingsOverrides");




16: }




17: }




18: #endregion //DaySettingsOverrides




19: 




20: #region DaysOfWeek




21: private string _daysOfWeek;




22: 




23: public string DaysOfWeek




24: {




25: get { return _daysOfWeek; }




26: set




27: {




28: _daysOfWeek = value;




29: OnPropertyChanged("DaysOfWeek");




30: }




31: }




32: #endregion //DaysOfWeek




33: 




34: #region Description




35: private string _description;




36: 




37: public string Description




38: {




39: get { return _description; }




40: set




41: {




42: _description = value;




43: OnPropertyChanged("Description");




44: }




45: }




46: #endregion //Description




47: 




48: #region EmailAddress




49: private string _emailAddress;




50: 




51: public string EmailAddress




52: {




53: get { return _emailAddress; }




54: set




55: {




56: _emailAddress = value;




57: OnPropertyChanged("EmailAddress");




58: }




59: }




60: #endregion //EmailAddress




61: 




62: #region FirstDayOfWeek




63: private Nullable<byte> _firstDayOfWeek;




64: 




65: public Nullable<byte> FirstDayOfWeek




66: {




67: get { return _firstDayOfWeek; }




68: set




69: {




70: _firstDayOfWeek = value;




71: OnPropertyChanged("FirstDayOfWeek");




72: }




73: }




74: #endregion //FirstDayOfWeek




75: 




76: #region Id




77: private string _id;




78: 




79: public string Id




80: {




81: get { return _id; }




82: set




83: {




84: _id = value;




85: OnPropertyChanged("Id");




86: }




87: 




88: }




89: #endregion //Id




90: 




91: #region IsLocked




92: private string _isLocked;




93: 




94: public string IsLocked




95: {




96: get { return _isLocked; }




97: set




98: {




99: _isLocked = value;




100: OnPropertyChanged("IsLocked");




101: }




102: }




103: #endregion //IsLocked




104: 




105: #region IsVisible




106: private string _isVisible;




107: 




108: public string IsVisible




109: {




110: get { return _isVisible; }




111: set




112: {




113: _isVisible = value;




114: OnPropertyChanged("IsVisible");




115: }




116: }




117: #endregion //IsVisible




118: 




119: #region Name




120: private string _name;




121: 




122: public string Name




123: {




124: get { return _name; }




125: set




126: {




127: _name = value;




128: OnPropertyChanged("Name");




129: }




130: }




131: #endregion //Name




132: 




133: #region PrimaryCalendarId




134: private string _primaryCalendarId;




135: 




136: public string PrimaryCalendarId




137: {




138: get { return _primaryCalendarId; }




139: set




140: {




141: _primaryCalendarId = value;




142: OnPropertyChanged("PrimaryCalendarId");




143: }




144: }




145: #endregion //PrimaryCalendarId




146: 




147: #region PrimaryTimeZoneId




148: private string _primaryTimeZoneId;




149: 




150: public string PrimaryTimeZoneId




151: {




152: get { return _primaryTimeZoneId; }




153: set




154: {




155: _primaryTimeZoneId = value;




156: OnPropertyChanged("PrimaryTimeZoneId");




157: }




158: }




159: #endregion //PrimaryTimeZoneId 




160: 




161: #endregion //Properties




162: }




 

 

ResourceCalendarInfo クラス:

 

1: public class ResourceCalendarInfo: BaseViewModel

2: {




3: 




4: #region Proeprties




5: 




6: #region BaseColor




7: private Nullable<int> _baseColor;




8: 




9: public Nullable<int> BaseColor




10: {




11: get { return _baseColor; }




12: set




13: {




14: _baseColor = value;




15: OnPropertyChanged("BaseColor");




16: }




17: }




18: #endregion //BaseColor




19: 




20: #region Description




21: private string _description;




22: 




23: public string Description




24: {




25: get { return _description; }




26: set




27: {




28: _description = value;




29: OnPropertyChanged("Description");




30: 




31: }




32: }




33: #endregion //Description




34: 




35: #region Id




36: private string _id;




37: 




38: public string Id




39: {




40: get { return _id; }




41: set




42: {




43: _id = value;




44: OnPropertyChanged("Id");




45: }




46: 




47: }




48: #endregion //Id




49: 




50: #region IsVisible




51: private string _isVisible;




52: 




53: public string IsVisible




54: {




55: get { return _isVisible; }




56: set




57: {




58: _isVisible = value;




59: OnPropertyChanged("IsVisible");




60: }




61: }




62: #endregion //IsVisible




63: 




64: #region Name




65: private string _name;




66: 




67: public string Name




68: {




69: get { return _name; }




70: set




71: {




72: _name = value;




73: OnPropertyChanged("Name");




74: }




75: }




76: #endregion //Name




77: 




78: #region OwningResourceId




79: private string _owningResourceId;




80: 




81: public string OwningResourceId




82: {




83: get { return _owningResourceId; }




84: set




85: {




86: _owningResourceId = value;




87: OnPropertyChanged("OwningResourceId");




88: }




89: }




90: #endregion //OwningResourceId




91: 




92: #region UnmappedProperties




93: private string _unmappedProperties;




94: 




95: public string UnmappedProperties




96: {




97: get { return _unmappedProperties; }




98: set { _unmappedProperties = value; }




99: }




100: #endregion //UnmappedProperties 




101: 




102: #endregion //Proeprties




103: 




104: }




 

 

AppointmentInfo クラス:

 

1: public class AppointmentInfo : BaseViewModel

2: {




3: 




4: #region Properties




5: 




6: #region Description




7: /// <summary>




8: /// local variable _description




9: /// </summary>




10: private string _description;




11: 




12: /// <summary>




13: /// Identifies the Description property.




14: /// </summary> 




15: public string Description




16: {




17: get { return _description; }




18: set




19: {




20: _description = value;




21: OnPropertyChanged("Description");




22: }




23: }




24: #endregion //Description




25: 




26: #region End




27: 




28: /// <summary>




29: /// local variable _end




30: /// </summary>




31: private DateTime _end; // = DateTime.Now;




32: 




33: /// <summary>




34: /// Identifies the End property.




35: /// </summary> 




36: public DateTime End




37: {




38: get { return _end; }




39: set




40: {




41: _end = value;




42: OnPropertyChanged("End");




43: }




44: }




45: #endregion //End




46: 




47: #region EndTimeZoneId




48: /// <summary>




49: /// local variable _endTimeZoneId




50: /// </summary>




51: private string _endTimeZoneId;




52: 




53: /// <summary>




54: /// Identifies the EndTimeZoneId property.




55: /// </summary> 




56: public string EndTimeZoneId




57: {




58: get { return _endTimeZoneId; }




59: set




60: {




61: _endTimeZoneId = value;




62: OnPropertyChanged("EndTimeZoneId");




63: }




64: }




65: #endregion //EndTimeZoneId




66: 




67: #region Id




68: /// <summary>




69: /// local variable _id




70: /// </summary>




71: private string _id;




72: 




73: /// <summary>




74: /// Identifies the Id property.




75: /// </summary> 




76: public string Id




77: {




78: get { return _id; }




79: set




80: {




81: _id = value;




82: OnPropertyChanged("Id");




83: }




84: }




85: #endregion //Id




86: 




87: #region IsLocked




88: /// <summary>




89: /// local variable _myVar




90: /// </summary>




91: private Nullable<bool> _isLocked = true;




92: 




93: /// <summary>




94: /// Identifies the IsLocked property.




95: /// </summary> 




96: public Nullable<bool> IsLocked




97: {




98: get { return _isLocked; }




99: set




100: {




101: _isLocked = value;




102: OnPropertyChanged("IsLocked");




103: }




104: }




105: #endregion //IsLocked




106: 




107: #region IsOccurrenceDeleted




108: /// <summary>




109: /// local variable _isOccurrenceDeleted




110: /// </summary>




111: private Nullable<bool> _isOccurrenceDeleted;




112: 




113: /// <summary>




114: /// Identifies the IsOccurrenceDeleted property.




115: /// </summary> 




116: public Nullable<bool> IsOccurrenceDeleted




117: {




118: get { return _isOccurrenceDeleted; }




119: set




120: {




121: _isOccurrenceDeleted = value;




122: OnPropertyChanged("IsOccurrenceDeleted");




123: }




124: }




125: #endregion //IsOccurrenceDeleted




126: 




127: #region IsTimeZoneNeutral




128: /// <summary>




129: /// local variable _isTimeZoneNeutral




130: /// </summary>




131: private bool _isTimeZoneNeutral;




132: 




133: /// <summary>




134: /// Identifies the IsTimeZoneNeutral property.




135: /// </summary> 




136: public bool IsTimeZoneNeutral




137: {




138: get { return _isTimeZoneNeutral; }




139: set




140: {




141: _isTimeZoneNeutral = value;




142: OnPropertyChanged("IsTimeZoneNeutral");




143: }




144: }




145: #endregion //IsTimeZoneNeutral




146: 




147: #region IsVisible




148: /// <summary>




149: /// local variable _isVisible




150: /// </summary>




151: private Nullable<bool> _isVisible;




152: 




153: /// <summary>




154: /// Identifies the IsVisible property.




155: /// </summary> 




156: public Nullable<bool> IsVisible




157: {




158: get { return _isVisible; }




159: set




160: {




161: _isVisible = value;




162: OnPropertyChanged("IsVisible");




163: }




164: }




165: #endregion //IsVisible




166: 




167: #region Location




168: /// <summary>




169: /// local variable _location




170: /// </summary>




171: private string _location;




172: 




173: /// <summary>




174: /// Identifies the Location property.




175: /// </summary> 




176: public string Location




177: {




178: get { return _location; }




179: set




180: {




181: _location = value;




182: OnPropertyChanged("Location");




183: }




184: }




185: #endregion //Location




186: 




187: #region MaxOccurrenceDateTime




188: /// <summary>




189: /// local variable _mxOccurrenceDateTime




190: /// </summary>




191: private Nullable<DateTime> _mxOccurrenceDateTime;




192: 




193: /// <summary>




194: /// Identifies the MaxOccurrenceDateTime property.




195: /// </summary> 




196: public Nullable<DateTime> MaxOccurrenceDateTime




197: {




198: get { return _mxOccurrenceDateTime; }




199: set




200: {




201: _mxOccurrenceDateTime = value;




202: OnPropertyChanged("MaxOccurrenceDateTime");




203: }




204: }




205: #endregion //MaxOccurrenceDateTime




206: 




207: #region OriginalOccurrenceEnd




208: 




209: /// <summary>




210: /// local variable _originalOccurrenceEnd




211: /// </summary>




212: private DateTime _originalOccurrenceEnd; // = DateTime.Now;




213: 




214: /// <summary>




215: /// Identifies the OriginalOccurrenceEnd property.




216: /// </summary> 




217: public DateTime OriginalOccurrenceEnd




218: {




219: get { return _originalOccurrenceEnd; }




220: set




221: {




222: _originalOccurrenceEnd = value;




223: OnPropertyChanged("OriginalOccurrenceEnd");




224: }




225: }




226: #endregion //OriginalOccurrenceEnd




227: 




228: #region OriginalOccurrenceStart




229: 




230: /// <summary>




231: /// local variable _originalOccurrenceStart




232: /// </summary>




233: private DateTime _originalOccurrenceStart; // = DateTime.Now;




234: 




235: /// <summary>




236: /// Identifies the OriginalOccurrenceStart property.




237: /// </summary> 




238: public DateTime OriginalOccurrenceStart




239: {




240: get { return _originalOccurrenceStart; }




241: set




242: {




243: _originalOccurrenceStart = value;




244: OnPropertyChanged("OriginalOccurrenceStart");




245: }




246: }




247: #endregion //OriginalOccurrenceStart




248: 




249: #region OwningCalendarId




250: /// <summary>




251: /// local variable _owningCalendarId




252: /// </summary>




253: private string _owningCalendarId;




254: 




255: /// <summary>




256: /// Identifies the OwningCalendarId property.




257: /// </summary> 




258: public string OwningCalendarId




259: {




260: get { return _owningCalendarId; }




261: set




262: {




263: _owningCalendarId = value;




264: OnPropertyChanged("OwningCalendarId");




265: }




266: }




267: #endregion //OwningCalendarId




268: 




269: #region OwningResourceId




270: /// <summary>




271: /// local variable _owningResourceId




272: /// </summary>




273: private string _owningResourceId;




274: 




275: /// <summary>




276: /// Identifies the OwningResourceId property.




277: /// </summary> 




278: public string OwningResourceId




279: {




280: get { return _owningResourceId; }




281: set




282: {




283: _owningResourceId = value;




284: OnPropertyChanged("OwningResourceId");




285: }




286: }




287: #endregion //OwningResourceId




288: 




289: #region Recurrence




290: /// <summary>




291: /// local variable _recurrence




292: /// </summary>




293: private string _recurrence;




294: 




295: /// <summary>




296: /// Identifies the Recurrence property.




297: /// </summary> 




298: public string Recurrence




299: {




300: get { return _recurrence; }




301: set




302: {




303: _recurrence = value;




304: OnPropertyChanged("Recurrence");




305: }




306: }




307: #endregion //Recurrence




308: 




309: #region RecurrenceVersion




310: /// <summary>




311: /// local variable _recurrenceVersion




312: /// </summary>




313: private Nullable<int> _recurrenceVersion;




314: 




315: /// <summary>




316: /// Identifies the RecurrenceVersion property.




317: /// </summary> 




318: public Nullable<int> RecurrenceVersion




319: {




320: get { return _recurrenceVersion; }




321: set




322: {




323: _recurrenceVersion = value;




324: OnPropertyChanged("RecurrenceVersion");




325: }




326: }




327: #endregion //RecurrenceVersion




328: 




329: #region Reminder




330: /// <summary>




331: /// local variable _reminder




332: /// </summary>




333: private string _reminder;




334: 




335: /// <summary>




336: /// Identifies the Reminder property.




337: /// </summary> 




338: public string Reminder




339: {




340: get { return _reminder; }




341: set




342: {




343: _reminder = value;




344: OnPropertyChanged("Reminder");




345: }




346: }




347: #endregion //Reminder




348: 




349: #region ReminderEnabled




350: /// <summary>




351: /// local variable _reminderEnabled




352: /// </summary>




353: private Nullable<bool> _reminderEnabled;




354: 




355: /// <summary>




356: /// Identifies the ReminderEnabled property.




357: /// </summary> 




358: public Nullable<bool> ReminderEnabled




359: {




360: get { return _reminderEnabled; }




361: set




362: {




363: _reminderEnabled = value;




364: OnPropertyChanged("ReminderEnabled");




365: }




366: }




367: #endregion //ReminderEnabled




368: 




369: #region ReminderInterval




370: /// <summary>




371: /// local variable _ReminderInterval




372: /// </summary>




373: private TimeSpan _reminderInterval;




374: 




375: /// <summary>




376: /// Identifies the ReminderInterval property.




377: /// </summary> 




378: public TimeSpan ReminderInterval




379: {




380: get { return _reminderInterval; }




381: set




382: {




383: _reminderInterval = value;




384: OnPropertyChanged("ReminderInterval");




385: }




386: }




387: #endregion //ReminderInterval




388: 




389: #region RootActivityId




390: /// <summary>




391: /// local variable _rootActivityId




392: /// </summary>




393: private string _rootActivityId;




394: 




395: /// <summary>




396: /// Identifies the RootActivityId property.




397: /// </summary> 




398: public string RootActivityId




399: {




400: get { return _rootActivityId; }




401: set




402: {




403: _rootActivityId = value;




404: OnPropertyChanged("RootActivityId");




405: }




406: }




407: #endregion //RootActivityId




408: 




409: #region Start




410: 




411: /// <summary>




412: /// local variable _start




413: /// </summary>




414: private DateTime _start; // = DateTime.Now;




415: 




416: /// <summary>




417: /// Identifies the Start property.




418: /// </summary> 




419: public DateTime Start




420: {




421: get { return _start; }




422: set




423: {




424: _start = value;




425: OnPropertyChanged("Start");




426: }




427: }




428: #endregion //Start




429: 




430: #region StartTimeZoneId




431: /// <summary>




432: /// local variable _startTimeZoneId




433: /// </summary>




434: private string _startTimeZoneId;




435: 




436: /// <summary>




437: /// Identifies the StartTimeZoneId property.




438: /// </summary> 




439: public string StartTimeZoneId




440: {




441: get { return _startTimeZoneId; }




442: set




443: {




444: _startTimeZoneId = value;




445: OnPropertyChanged("StartTimeZoneId");




446: }




447: }




448: #endregion //StartTimeZoneId




449: 




450: #region Subject




451: /// <summary>




452: /// local variable _myVar




453: /// </summary>




454: private string _subject;




455: 




456: /// <summary>




457: /// Identifies the Subject property.




458: /// </summary> 




459: public string Subject




460: {




461: get { return _subject; }




462: set




463: {




464: _subject = value;




465: OnPropertyChanged("Subject");




466: }




467: }




468: #endregion //Subject




469: 




470: #region UnmappedProperties




471: /// <summary>




472: /// local variable _unmappedProperties




473: /// </summary>




474: private string _unmappedProperties;




475: 




476: /// <summary>




477: /// Identifies the UnmappedProperties property.




478: /// </summary> 




479: public string UnmappedProperties




480: {




481: get { return _unmappedProperties; }




482: set




483: {




484: _unmappedProperties = value;




485: OnPropertyChanged("UnmappedProperties");




486: }




487: }




488: #endregion //UnmappedProperties




489: 




490: #region VariantProperties




491: /// <summary>




492: /// local variable _variantProperties




493: /// </summary>




494: private Nullable<long> _variantProperties;




495: 




496: /// <summary>




497: /// Identifies the VariantProperties property.




498: /// </summary> 




499: public Nullable<long> VariantProperties




500: {




501: get { return _variantProperties; }




502: set




503: {




504: _variantProperties = value;




505: OnPropertyChanged("VariantProperties");




506: }




507: }




508: #endregion //VariantProperties 




509: 




510: #endregion //Properties




511: 




512: }




 

 

xamSchedule スイートに必要なコレクション (リソースのデータ、リソース予定表、予定) を含むクラスを作成します。ScheduleViewModel という名前をつけます。このサンプルでは使用されませんが、タスクおよびログ (メモ) のデータも処理できます。

 

 

1: public class ScheduleViewModel : BaseViewModel

2: {




3: 




4: #region Construtors




5: public ScheduleViewModel()




6: {




7: }




8: 




9: public ScheduleViewModel(string currentUserId, string currentUserName, string currentUserCalendarId)




10: {




11: Resources.Add(new ResourceInfo




12: {




13: Id = currentUserId,




14: Name = currentUserName




15: 




16: });




17: 




18: ResourceCalendars.Add(new ResourceCalendarInfo




19: {




20: Id = currentUserCalendarId,




21: OwningResourceId = currentUserId




22: });




23: 




24: this.CurrentResourceCalendar = this.ResourceCalendars[0];




25: 




26: }




27: #endregion //Construtors




28: 




29: #region Properties




30: 




31: #region Appointments




32: private ObservableCollection<AppointmentInfo> _appointments = new ObservableCollection<AppointmentInfo>();




33: public ObservableCollection<AppointmentInfo> Appointments




34: {




35: get { return _appointments; }




36: set




37: {




38: _appointments = value;




39: OnPropertyChanged("Appointments");




40: }




41: }




42: #endregion //Appointments




43: 




44: #region CalendarDisplayMode




45: /// <summary>




46: /// local variable _CalendarDisplayMode 




47: /// </summary>




48: private CalendarDisplayMode _calendarDisplayMode = CalendarDisplayMode.Separate;




49: 




50: /// <summary>




51: /// Identifies the CalendarDisplayMode property.




52: /// </summary> 




53: public CalendarDisplayMode CalendarDisplayMode




54: {




55: get { return _calendarDisplayMode; }




56: set




57: {




58: _calendarDisplayMode = value;




59: OnPropertyChanged("CalendarDisplayMode ");




60: }




61: }




62: #endregion //CalendarDisplayMode




63: 




64: #region CurrentResourceCalendar




65: private ResourceCalendarInfo _currentResourceCalendar = new ResourceCalendarInfo();




66: [System.Xml.Serialization.XmlIgnoreAttribute]




67: public ResourceCalendarInfo CurrentResourceCalendar




68: {




69: get { return _currentResourceCalendar; }




70: set




71: {




72: _currentResourceCalendar = value;




73: OnPropertyChanged("CurrentResourceCalendar");




74: }




75: }




76: #endregion //CurrentResourceCalendar




77: 




78: #region Resources




79: private ObservableCollection<ResourceInfo> _resources = new ObservableCollection<ResourceInfo>();




80: public ObservableCollection<ResourceInfo> Resources




81: {




82: get { return _resources; }




83: set




84: {




85: _resources = value;




86: OnPropertyChanged("Resources");




87: }




88: }




89: #endregion //Resources




90: 




91: #region ResourceCalendars




92: private ObservableCollection<ResourceCalendarInfo> _resourceCalendars = new ObservableCollection<ResourceCalendarInfo>();




93: public ObservableCollection<ResourceCalendarInfo> ResourceCalendars




94: {




95: get { return _resourceCalendars; }




96: set




97: {




98: _resourceCalendars = value;




99: OnPropertyChanged("ResourceCalendars");




100: }




101: }




102: #endregion //ResourceCalendars 




103: 




104: #endregion //Properties




105: 




106: }




 

 

ListScheduleDataConnector を追加し、マッピング フィールドを設定します。

MainPage.xaml に ListScheduleDataConnector を追加します。

 

1: <ig:ListScheduleDataConnector HorizontalAlignment="Left" Name="listScheduleDataConnector1" VerticalAlignment="Top"

2: ResourceItemsSource="{Binding Resources, Mode=TwoWay}" Loaded="ListScheduleDataConnector1Loaded"




3: ResourceCalendarItemsSource="{Binding ResourceCalendars, Mode=TwoWay}"




4: AppointmentItemsSource="{Binding Appointments, Mode=TwoWay}">




5: <ig:ListScheduleDataConnector.ResourcePropertyMappings>




6: <ig:ResourcePropertyMappingCollection UseDefaultMappings="True"/>




7: </ig:ListScheduleDataConnector.ResourcePropertyMappings>




8: <ig:ListScheduleDataConnector.ResourceCalendarPropertyMappings>




9: <ig:ResourceCalendarPropertyMappingCollection UseDefaultMappings="True"/>




10: </ig:ListScheduleDataConnector.ResourceCalendarPropertyMappings>




11: <ig:ListScheduleDataConnector.AppointmentPropertyMappings>




12: <ig:AppointmentPropertyMappingCollection UseDefaultMappings="True"/>




13: </ig:ListScheduleDataConnector.AppointmentPropertyMappings>




14: </ig:ListScheduleDataConnector>




 

 

ResourcePropertyMappings、ResourceCaendarPropertyMappings 、および AppointmentPropertyMappings を使用することによって、データ ソース オブジェクトと xamSchedule オブジェクトのプロパティをマッピングします。サンプルでは、データ ソース オブジェクトおよび xamSchedule オブジェクトは同じ名前を使用しているのでデフォルト マッピングを使用します。

xamScheduleDataManager を追加します。

XAML に xamScheduleDataManager を追加し、DataConnector のような ListScheduleDataConnector インスタンスを設定します。

 

 

1: <ig:XamScheduleDataManager HorizontalAlignment="Left" Name="xamScheduleDataManager1" CurrentUserId="currentUser"

2: VerticalAlignment="Top" DataConnector="{Binding ElementName=listScheduleDataConnector1}" >




3: <ig:XamScheduleDataManager.Settings>




4: <ig:ScheduleSettings>




5: <ig:ScheduleSettings.AppointmentSettings>




6: <ig:AppointmentSettings AllowEdit="False" AllowDragging="No" AllowResizing="No"/>




7: </ig:ScheduleSettings.AppointmentSettings>




8: </ig:ScheduleSettings>




9: </ig:XamScheduleDataManager.Settings>




10: </ig:XamScheduleDataManager>




 

アクティビティ動作 (このサンプルでは AppointmentSettings) のために Settings プロパティの設定も可能です。設定の編集ができなくなります。

 

xamDayView、xamScheduleView、および xamMonthView、スケジュール スイートから UI コンポーネントを追加します。

アプリケーションに別のビューを提供するには、xamDayView、xamScheduleView、および xamMonthView コンポーネントを追加します。

 

1: <ig:XamDayView HorizontalAlignment="Stretch" Name="xamDayView1" VerticalAlignment="Stretch"

2: DataManager="{Binding ElementName=xamScheduleDataManager1}" MultiDayActivityAreaVisibility="Visible" />




3: <ig:XamScheduleView HorizontalAlignment="Stretch" Name="xamScheduleView1" VerticalAlignment="Stretch"




4: DataManager="{Binding ElementName=xamScheduleDataManager1}" Visibility="Collapsed" />




5: <ig:XamMonthView HorizontalAlignment="Stretch" Name="xamMonthView1" VerticalAlignment="Stretch"




6: DataManager="{Binding ElementName=xamScheduleDataManager1}" Visibility="Collapsed" />




7: <ig:XamOutlookBar Grid.Column="1" HorizontalAlignment="Stretch" Name="xamOutlookBar1" VerticalAlignment="Stretch">




 

 

xamDayView、xamScheduleView、および xamMonthView から常に 1 つのビューのみ表示します。
ビューを変更するためには、ビューを切り替えるロジックが追加されたリスト ボックスを実装します。

 

1: <ListBox x:Name="ListScheduleViews" Margin="0 0 0 -2" SelectionMode="Single" SelectionChanged="ListScheduleViews_SelectionChanged">

2: <ListBox.ItemsPanel>




3: <ItemsPanelTemplate>




4: <StackPanel Orientation="Vertical" Margin="0" Width="150" />




5: </ItemsPanelTemplate>




6: </ListBox.ItemsPanel>




7: <ListBoxItem x:Name="DayViewItem" Content="Day View" Tag="DayView" Margin="0 0 10 0" IsSelected="True" />




8: <ListBoxItem x:Name="ScheduleViewItem" Content="Schedule View" Tag="ScheduleView" Margin="0 0 10 0" IsSelected="False" />




9: <ListBoxItem x:Name="MonthViewItem" Content="Month View" Tag="MonthView" Margin="0 0 10 0" IsSelected="False" />




10: </ListBox>




 

 

ビューの表示/非表示を切り替えるための C# コード。

 

1: #region ListScheduleViews_SelectionChanged

2: private void ListScheduleViews_SelectionChanged(object sender, SelectionChangedEventArgs e)




3: {




4: ListBoxItem item = e.AddedItems[0] as ListBoxItem;




5: if (item != null)




6: {




7: SetScheduleMode(item.Tag.ToString());




8: }




9: }




10: #endregion //ListScheduleViews_SelectionChanged




11: 




12: #region SetScheduleMode




13: private void SetScheduleMode(string viewName)




14: {




15: if (this.xamDayView1 == null || this.xamMonthView1 == null || this.xamScheduleView1 == null)




16: {




17: return;




18: }




19: 




20: switch (viewName)




21: {




22: case "DayView":




23: this.xamDayView1.Visibility = System.Windows.Visibility.Visible;




24: this.xamMonthView1.Visibility = System.Windows.Visibility.Collapsed;




25: this.xamScheduleView1.Visibility = System.Windows.Visibility.Collapsed;




26: break;




27: case "ScheduleView":




28: this.xamDayView1.Visibility = System.Windows.Visibility.Collapsed;




29: this.xamMonthView1.Visibility = System.Windows.Visibility.Collapsed;




30: this.xamScheduleView1.Visibility = System.Windows.Visibility.Visible;




31: break;




32: case "MonthView":




33: this.xamDayView1.Visibility = System.Windows.Visibility.Collapsed;




34: this.xamMonthView1.Visibility = System.Windows.Visibility.Visible;




35: this.xamScheduleView1.Visibility = System.Windows.Visibility.Collapsed;




36: break;




37: }




38: }




39: #endregion //SetScheduleMode




 

 複数予定表のサポートを実装します。

要件によって別の予定表を使用することがあります。
リソースに複数の予定表を表示するためには、同じ予定表グループに予定表を追加する必要があります。

デフォルトでは、CalendarResource を追加すると、別のグループに追加されます。

 

ScheduleViewModel scheduleViewModel;

…..

ResourceCalendarInfo calendar = new ResourceCalendarInfo();

_scheduleViewModel.ResourceCalendars.Add(calendar);

この式では新しいグループに予定表を追加します。

以下のサンプルでは、同じグループに他のカレンダーを追加します。

 

1: #region InitResourceCalendar

2: private void InitResourceCalendar(ResourceCalendarInfo calendar)




3: {




4: 




5: var resource = xamScheduleDataManager1.ResourceItems.GetResourceFromId(this._scheduleViewModel.Resources[0].Id);




6: 




7: if (resource == null)




8: {




9: return;




10: }




11: 




12: ResourceCalendar calendar2 = resource.Calendars.First(c => c.Id == calendar.Id);




13: 




14: CalendarGroup groupWithCalendarAdded =




15: xamScheduleDataManager1.CalendarGroups.FirstOrDefault(cg => cg.Calendars.Contains(calendar2));




16: if (groupWithCalendarAdded != null)




17: {




18: groupWithCalendarAdded.Calendars.Remove(calendar2);




19: if (groupWithCalendarAdded.Calendars.Count == 0)




20: xamScheduleDataManager1.CalendarGroups.Remove(groupWithCalendarAdded);




21: }




22: 




23: CalendarGroup calGroup;




24: if (xamScheduleDataManager1.CalendarGroups.Count > 0)




25: {




26: int index = 0;




27: calGroup = xamScheduleDataManager1.CalendarGroups[index];




28: calGroup.Calendars.Add(calendar2);




29: }




30: else




31: {




32: calGroup = new CalendarGroup();




33: calGroup.Calendars.Add(calendar2);




34: xamScheduleDataManager1.CalendarGroups.Add(calGroup);




35: }




36: 




37: }




38: #endregion //InitResourceCalendar




 

 予定表表示モードのためのランタイム サポートを実装します。

リソースに複数の予定表がある場合、それぞれの予定表を別に表すことも可能です:
Separate、Overlay、または Merged。

xamSchedule ビューの CalendarDisplayMode プロパティの詳細については、ここを参照してください。

以下のサンプルでは、CalendarDisplayMode のすべての列挙型がある ComboBox を追加し、選択変更時に 3 つのビューの CalendarDisplayMode プロパティを変更します。

  
 

 

 

1: <ComboBox x:Name="cmbCalendarDisplayMode" Margin="0,10,0,0" Width="140" HorizontalAlignment="Stretch"

2: ItemsSource="{Binding CalendarDisplayMode, Mode=TwoWay, Converter={StaticResource enumConverter}}"




3: SelectedItem="{Binding CalendarDisplayMode, Mode=TwoWay}" Foreground="Black" SelectionChanged="CmbCalendarDisplayModeSelectionChanged"/>




 

 

 

以下のコードは、すべてのビューで CalendarDisplayMode プロパティを変更します。

 

 

 

1: #region CmbCalendarDisplayModeSelectionChanged

2: private void CmbCalendarDisplayModeSelectionChanged(object sender, SelectionChangedEventArgs e)




3: {




4: if (e.AddedItems.Count < 1)




5: {




6: return;




7: }




8: 




9: CalendarDisplayMode cmode = (CalendarDisplayMode)e.AddedItems[0];




10: 




11: this.xamDayView1.CalendarDisplayMode = cmode;




12: this.xamScheduleView1.CalendarDisplayMode = cmode;




13: this.xamMonthView1.CalendarDisplayMode = cmode;




14: }




15: #endregion //CmbCalendarDisplayModeSelectionChanged




 

現在の xamSchedule 設定の永続化を実装します。

接続の問題またはサーバーにデータを提出する前に変更する必要がある場合は、スケジュール設定およびデータをローカルに保持することが可能です。

以下のコードでは、データを分離ストレージに保存し、アプリケーションに読み込みます。 

 

 

1: 

2: #region BtnLoadData_Click




3: private void BtnLoadData_Click(object sender, RoutedEventArgs e)




4: {




5: 




6: XmlSerializer xs = new XmlSerializer(typeof(ScheduleViewModel));




7: 




8: Stream str = new MemoryStream(ReadDataFromStore(IsoFile));




9: using (StreamReader rd = new StreamReader(str))




10: {




11: ScheduleViewModel favourites = xs.Deserialize(rd) as ScheduleViewModel;




12: if (favourites != null)




13: {




14: this._scheduleViewModel.Appointments.Clear();




15: this._scheduleViewModel.ResourceCalendars.Clear();




16: 




17: foreach (ResourceCalendarInfo calInfo in favourites.ResourceCalendars)




18: {




19: this._scheduleViewModel.ResourceCalendars.Add(calInfo);




20: this.InitResourceCalendar(calInfo);




21: }




22: 




23: foreach (AppointmentInfo app in favourites.Appointments)




24: {




25: this._scheduleViewModel.Appointments.Add(app);




26: }




27: }




28: }




29: }




30: #endregion //BtnLoadData_Click




31:




32: #region BtnSaveData_Click




33: private void BtnSaveData_Click(object sender, RoutedEventArgs e)




34: {




35: XmlSerializer xs = new XmlSerializer(typeof(ScheduleViewModel));




36: MemoryStream str = new MemoryStream();




37: StreamWriter sr = new StreamWriter(str);




38: xs.Serialize(sr, this._scheduleViewModel);




39: WriteDataToStore(str.ToArray(), IsoFile);




40: }




41: #endregion //BtnSaveData_Click 




42: 




43: 




44: #region ReadDataFromStore




45: //Reads a file from the Isolated Storage, specified by name




46: private static byte[] ReadDataFromStore(string fileName)




47: {




48: using (var store = IsolatedStorageFile.GetUserStoreForApplication())




49: {




50: IsolatedStorageFileStream fileStream;




51: fileStream = store.OpenFile(fileName, FileMode.Open);




52: byte[] b = new byte[fileStream.Length];




53: fileStream.Read(b, 0, (int)fileStream.Length);




54: fileStream.Close();




55: return b;




56: }




57: }




58: #endregion //ReadDataFromStore




59:




60: 




61: #region WriteDataToStore




62: // Writes a file to an Isolated IStrorage, specified via its name 




63: // and content like a byte array




64: private static void WriteDataToStore(byte[] data, string fileName)




65: {




66: if (data == null || data.Length == 0)




67: return;




68: using (var store = IsolatedStorageFile.GetUserStoreForApplication())




69: {




70: CleanStorage(store);




71: 




72: IsolatedStorageFileStream fileStream = store.CreateFile(fileName);




73: fileStream.Write(data, 0, data.Length);




74: fileStream.Close();




75: 




76: }




77: }




 


TimeZone オプションを処理します。

タイム ゾーンのサポートは、信頼性のあるスケジュール システムには不可欠です。

タイム ゾーン情報の提供
タイム ゾーンの変換を正確に行うには、スケジュール コントロールに各タイム ゾーンの基本 UTC オフセットおよびサマータイムの開始時刻と終了時刻を定義するルールを含み、すべてのタイム ゾーンについての情報にアクセスする必要があります。

WPF フレームワークは、TimeZoneInfo クラスを介してすべてのタイム ゾーンに対してこの情報を提供します。Silveright では、TimeZoneInfo クラスはフレームワークに存在しますが、「ローカル」および「UTC」タイム ゾーンの情報を公開するだけです。

以下は xamSchedule のタイムゾーン サポートの詳細になります。

同じサマータイムを使用する領域がいくつかあります。Silverlight フレームワークはユーザーのタイムゾーンを動的に公開しないため、ユーザーにダイアログを表示する必要があります。WPF フレームワークはローカル タイムゾーン ID を公開するためこのような問題はありません。複数のタイムゾーンで 1 つのサマータイムが使用されるので、ユーザーにダイアログを表示する必要はありません。ただし、これらのタイムゾーンでユーザーが「サマータイム設定に時計を自動的に調整する」のチェックを解除した場合、タイムゾーンを選択するダイアログを表示する必要があります。

その場合、アプリケーションを開始したときにダイアログを表示します。

 

表示しないようにするには、TimeZoneInfoProviderResolved.LocalTimeZoneId  の DataConnector に有効なタイムゾーンを設定してください。

 

1: #region ListScheduleDataConnector1Loaded

2: private void ListScheduleDataConnector1Loaded(object sender, RoutedEventArgs e)




3: {




4: 




5: listScheduleDataConnector1.TimeZoneInfoProviderResolved.LocalTimeZoneId = "Jordan Standard Time";




6: 




7: }




8: #endregion //ListScheduleDataConnector1Loaded




 

 アプリケーションをテストしてみましょう。

アプリケーションを起動する:
タイムゾーンが設定されているため、ダイアログ ウインドウから選択する必要はありません。
デフォルト ビューは xamDayView インスタンスです。

 

xamOutlookBar の右側にある「予定表」グループを選択し、「新規作成」をクリックします。
新しい ResourceCalendar を設定するダイアログ ウインドウを表示します。
確認ダイアログに続いて新しい ResourceCalendar が画面に追加されます。CalendarDisplayMode が `Separate` です。

 

「メンテナンス」グループをクリックします。

「スケジュール ビュー」エキスパンダーを展開します。

リストから「スケジュール ビュー」を選択します。
xamScheduleView が表示され、xamDayView インスタンスが縮小されました。

 

リストから「Month View」を選択します。

 

CalendarDisplayMode を変更します:

「Calendar Display Mode」コンボボックスからオプションを `Overlay` に変更します。
予定表が重複して表示されます (ヘッダーが個別のシートのようになります)。

 

「Calendar Display Mode」コンボオックスからオプションを `Merged` に変更すると、
予定表がマージされます。

 

xamDayView コンポーネントをダブルクリックして予定を追加します。

 

ユーザー インターフェイスで選択して現在の予定表を変更し、新しい予定を追加します。

 

 

CalendarDisplayMode を `Merged` に変更します。

 

「Save Data」ボタンでデータをローカルに保存し、アプリケーションを再度読み込みます。

 

「Load Data」を選択し、保存した予定表および予定を読み込みます。

 

この記事で使用した XamScheduleDemo.zip のサンプル アプリケーションをダウンロードできます。

ページ 1 / 1 (1 項目) | RSS
Infragistics Japan
インフラジスティックス ジャパン