xamSchedule を弄ってみる(その1)
現在、次の案件のため Infragistics さんのスケジュールコントロール 「xamSchedule」 を調査中です。WPF サンプルブラウザーを見てると面白そうな機能がテンコ盛りなんですが、如何せんネットの情報の少なさには泣けてきますね。チュートリアルを実践し、サンプルプログラムを弄り倒し、ドキュメントと格闘しながらサンプルコードを読み倒さねばなりません。
xamSchedule のチュートリアルをネットで検索すると、CodeZine にある池原さんの記事が見つかります。
参考記事: Silverlight/WPFでデータバインディングを利用しOutlookライクなスケジュールを構築する その1 Silverlight編
2010年執筆のため、当時とはNetAdvantage の製品体系が変わっているなど記事の内容が若干古くなってますが、まあ仕方ないですね。また C#ベースの記事のため、当然 VB のコードは提示されてません。このコンポーネントを使うプロジェクトが VB のため、勉強がてら VB 版のコードを書いてみました。何かの参考になれば幸いです。
まずベースとなる ViewModelBaseクラスから・・・まあ、これは定番のコードですよね。
' ViewModelBase.vb Option Explicit On Option Strict On Imports System.ComponentModel Public Class ViewModelBase Implements INotifyPropertyChanged Protected Sub OnPropertyChanged(properyName As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(properyName)) End Sub Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged End Class
ViewModelBase から派生した各クラスのコードです。まず ResourceInfo クラスです。
' ResourceInfo.vb Option Explicit On Option Strict On Imports System Public Class ResourceInfo Inherits ViewModelBase #Region "プロパティ" Private _Id As String Public Property Id() As String Get Return _Id End Get Set(ByVal value As String) _Id = value OnPropertyChanged("Id") End Set End Property Private _PrimaryResourceCalenderId As String Public Property PrimaryResourceCalenderId() As String Get Return _PrimaryResourceCalenderId End Get Set(ByVal value As String) _PrimaryResourceCalenderId = value OnPropertyChanged("PrimaryResourceCalenderId") End Set End Property #End Region End Class
次は ResourceCalendarInfo クラスです。
' ResourceCalendarInfo.vb Option Explicit On Option Strict On Public Class ResourceCalendarInfo Inherits ViewModelBase #Region "プロパティ" Private _Id As String Public Property Id() As String Get Return _Id End Get Set(ByVal value As String) _Id = value OnPropertyChanged("Id") End Set End Property Private _OwningResourceId As String Public Property OwningResourceId() As String Get Return _OwningResourceId End Get Set(ByVal value As String) _OwningResourceId = value OnPropertyChanged("OwningResourceId") End Set End Property #End Region End Class
AppointmentInfo クラスです。
' AppointmentInfo.vb Option Explicit On Option Strict On Imports System Public Class AppointmentInfo Inherits ViewModelBase #Region "プロパティ" Private _Id As String Public Property Id() As String Get Return _Id End Get Set(ByVal value As String) _Id = value OnPropertyChanged("Id") End Set End Property Private _Start As Date Public Property Start() As Date Get Return _Start End Get Set(ByVal value As Date) _Start = value OnPropertyChanged("Start") End Set End Property Private _End As Date Public Property [End]() As Date Get Return _End End Get Set(ByVal value As Date) _End = value OnPropertyChanged("End") End Set End Property Private _OwningResourceId As String Public Property OwningResourceId() As String Get Return _OwningResourceId End Get Set(ByVal value As String) _OwningResourceId = value OnPropertyChanged("OwningResourceId") End Set End Property Private _OwningCalendarId As String Public Property OwningCalendarId() As String Get Return _OwningCalendarId End Get Set(ByVal value As String) _OwningCalendarId = value OnPropertyChanged("OwningCalendarId") End Set End Property Private _ReminderInterval As TimeSpan Public Property ReminderInterval() As TimeSpan Get Return _ReminderInterval End Get Set(ByVal value As TimeSpan) _ReminderInterval = value OnPropertyChanged("ReminderInterval") End Set End Property Private _ReminderEnabled As Boolean Public Property ReminderEnabled() As Boolean Get Return _ReminderEnabled End Get Set(ByVal value As Boolean) _ReminderEnabled = value OnPropertyChanged("ReminderEnabled") End Set End Property Private _Recurrence As String Public Property Recurrence() As String Get Return _Recurrence End Get Set(ByVal value As String) _Recurrence = value OnPropertyChanged("Recurrence") End Set End Property Private _RecurrenceVersion As Int32 Public Property RecurrenceVersion() As Int32 Get Return _RecurrenceVersion End Get Set(ByVal value As Int32) _RecurrenceVersion = value OnPropertyChanged("RecurrenceVersion") End Set End Property Private _RootActivityId As String Public Property RootActivityId() As String Get Return _RootActivityId End Get Set(ByVal value As String) _RootActivityId = value OnPropertyChanged("RootActivityId") End Set End Property Private _OriginalOccurrenceStart As Date Public Property OriginalOccurrenceStart() As Date Get Return _OriginalOccurrenceStart End Get Set(ByVal value As Date) _OriginalOccurrenceStart = value OnPropertyChanged("OriginalOccurrenceStart") End Set End Property Private _OriginalOccurrenceEnd As Date Public Property OriginalOccurrenceEnd() As Date Get Return _OriginalOccurrenceEnd End Get Set(ByVal value As Date) _OriginalOccurrenceEnd = value OnPropertyChanged("OriginalOccurrenceEnd") End Set End Property Private _IsOccurrenceDeleted As Boolean Public Property IsOccurrenceDeleted() As Boolean Get Return _IsOccurrenceDeleted End Get Set(ByVal value As Boolean) _IsOccurrenceDeleted = value OnPropertyChanged("IsOccurrenceDeleted") End Set End Property Private _VariantProperties As Int64 Public Property VariantProperties() As Int64 Get Return _VariantProperties End Get Set(ByVal value As Int64) _VariantProperties = value OnPropertyChanged("VariantProperties") End Set End Property Private _MyProperty As String Public Property MyProperty() As String Get Return _MyProperty End Get Set(ByVal value As String) _MyProperty = value OnPropertyChanged("MyProperty") End Set End Property #End Region End Class
最後は MainPageViewModel です。
' MainPageViewModel.vb Option Explicit On Option Strict On Imports System Imports System.Collections.ObjectModel Imports ScheduleDataViewModel Public Class MainPageViewModel Inherits ViewModelBase #Region "コンストラクタ" Public Sub New() ' リソースを作成 Me.Resources = New ObservableCollection(Of ResourceInfo)() Me.Resources.Add( New ResourceInfo With { .Id = "R0001", .PrimaryResourceCalenderId = "C0001" } ) ' リソースカレンダーを作成 Me.ResourceCalendars = New ObservableCollection(Of ResourceCalendarInfo)() Me.ResourceCalendars.Add( New ResourceCalendarInfo() With { .Id = "C0001", .OwningResourceId = "R0001" } ) ' 予定を追加 Me.Appointments = New ObservableCollection(Of AppointmentInfo)() Me.Appointments.Add( New AppointmentInfo() With { .Id = "A0001", .OwningCalendarId = "C0001", .OwningResourceId = "R0001", .Start = DateTime.Now.ToUniversalTime(), .End = DateTime.Now.AddHours(2).ToUniversalTime() } ) ' 現在のユーザー ID を指定 Me.CurrentUserId = Me.Resources(0).Id End Sub #End Region #Region "プロパティ" Private _Resources As ObservableCollection(Of ResourceInfo) Public Property Resources() As ObservableCollection(Of ResourceInfo) Get Return _Resources End Get Set(ByVal value As ObservableCollection(Of ResourceInfo)) If (Object.Equals(_Resources, value)) Then Return _Resources = value OnPropertyChanged("Resources") End Set End Property Private _ResourceCalendars As ObservableCollection(Of ResourceCalendarInfo) Public Property ResourceCalendars() As ObservableCollection(Of ResourceCalendarInfo) Get Return _ResourceCalendars End Get Set(ByVal value As ObservableCollection(Of ResourceCalendarInfo)) If (Object.Equals(_ResourceCalendars, value)) Then Return _ResourceCalendars = value OnPropertyChanged("ResourceCalendars") End Set End Property Private _Appointments As ObservableCollection(Of AppointmentInfo) Public Property Appointments() As ObservableCollection(Of AppointmentInfo) Get Return _Appointments End Get Set(ByVal value As ObservableCollection(Of AppointmentInfo)) If (Object.Equals(_Appointments, value)) Then Return _Appointments = value OnPropertyChanged("Appointments") End Set End Property Private _CurrentUserId As String Public Property CurrentUserId() As String Get Return _CurrentUserId End Get Set(ByVal value As String) If (Object.Equals(_CurrentUserId, value)) Then Return _CurrentUserId = value OnPropertyChanged("CurrentUserId") End Set End Property #End Region End Class
ちなみに MainPage.xaml.vb ですが、DataContext の設定を XAML で対処したため、コードビハインドはコーディング不要です。
<UserControl x:Class="xamSchedule_SL.MainPage" ・・・・・・ xmlns:local="clr-namespace:xamSchedule_SL" /> ・・・・・・ <UserControl.DataContext> <local:MainPageViewModel /> </UserControl.DataContext>