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>