バージョン

ListBackedProject による任意のタスク コレクションとのバインディング

トピックの概要

目的

このトピックでは、ListBackedProject で xamGantt™ コントロールを任意のタスク コレクションにバインドする方法を説明します。

ListBackedProject による任意のタスク コレクションとのバインディング

概要

xamGantt コントロールは、カスタム タスクのコレクションにバインドできます。その場合、 ListBackedProject のインスタンスを作成して、それを xamGanttProject プロパティに設定します。

ListBackedProject に、その TaskItemsSource プロパティでカスタム タスクのフラット コレクションを与え、カスタム タスク プロパティと、対応する ProjectTask プロパティ間のマッピングを、 TaskPropertyMappings コレクションで定義します。

以下の手順では、XML ファイルからカスタム タスク コレクションをポピュレートします。この手順で、カスタム タスク Model と、XML ファイルの動作を処理する ViewModel クラスも作成できます。

プレビュー

以下のスクリーンショットはその結果のプレビューです。

Binding to Arbitrary Task Collection Using ListBackedProject 1.png

前提条件

この手順を実行するには、以下が必要です。

  • 以下の必要な NuGet パッケージへの参照を含むプロジェクト。

    • Infragistics.WPF.Gantt

    NuGet フィードのセットアップと NuGet パッケージの追加の詳細については、NuGet フィード ドキュメントを参照してください。

  • ListBackedProject

  • xml データを操作する拡張メソッドをおさめた XElementExtension クラス

  • サンプル xml データ ソース - TaskData.xml

手順

以下の手順では、カスタム タスクのコレクションに xamGantt コントロールをバインドする方法を説明します。

  1. カスタム タスク Model クラスを作成する

データを表示し、INotifyPropertyChanged インターフェイスを実装するカスタム タスク モデルを作成します。

詳細については、コード コード例: カスタム タスク モデルを参照してください。

  1. ViewModel クラスを作成する

xml データの読み込みを処理し、カスタム タスクのデータを保存する TaskModel の ObservableCollection 型の Tasks 公開メンバーがある ViewModel クラスを作成します。

詳細については、コード コード例: ViewModel クラスを参照してください。

  1. XAML ページに必要な名前空間を追加する

XAML ページの先頭に以下の名前空間を追加します。

XAML の場合:

xmlns:ig="http://schemas.infragistics.com/xaml"
xmlns:viewmodel="clr-namespace:<Your ViewModel Namespace>"
  1. ページにグリッドを追加し、その DataContext を作成した ViewModel にバインドする

ページにグリッドを追加し、グリッド DataContext プロパティをカスタム タスク ビュー モデル クラス ListBackedProjectViewModel にバインドします。

XAML の場合:

<Grid x:Name="LayoutRoot">
  <Grid.Resources>
    <viewmodel:ListBackedProjectViewModel x:Key="viewmodel"/>
  </Grid.Resources>
  <Grid.DataContext>
    <Binding Source="{StaticResource viewmodel}" />
  </Grid.DataContext>
…
</Grid>
  1. ListBackedProject を作成してデータにバインドする

ListBackedProject は、派生した Project クラスです。指定したタスク情報のフラット コレクションに基づいてタスクをポピュレートします。

ListBackedProject は、作成して Tasks 公開メンバーに保存したカスタム タスク データに TaskItemsSource プロパティでバインドします。

XAML の場合:

<ig:ListBackedProject x:Name="dataProvider"
                      TaskItemsSource="{Binding Tasks}">
</ig:ListBackedProject>
  1. カスタム タスク プロパティ マッピングにプロジェクト タスク プロパティを作成する

TaskPropertyMappings でマッピング コレクションを作成します。

どの ProjectTaskPropertyMapping でも TaskPropertyProjectTask プロパティを指定し、 DataObjectProperty は対応するカスタム タスク プロパティを指定します。

たとえば、 ProjectTask DataItemId プロパティを、カスタム TaskModel クラスに定義した TaskID プロパティにマップする例で解説します。

XAML の場合:

<ig:ListBackedProject.TaskPropertyMappings>
  <ig:ProjectTaskPropertyMappingCollection
      UseDefaultMappings="True">
  <ig:ProjectTaskPropertyMapping
      TaskProperty="DataItemId"
      DataObjectProperty="TaskID" />
  <ig:ProjectTaskPropertyMapping
      TaskProperty="Tasks"
      DataObjectProperty="Tasks" />
  <ig:ProjectTaskPropertyMapping
      TaskProperty="ConstraintType"
      DataObjectProperty="ConstraintType" />
  <ig:ProjectTaskPropertyMapping
      TaskProperty="ConstraintDate"
      DataObjectProperty="ConstraintDate" />
  <ig:ProjectTaskPropertyMapping
      TaskProperty="DurationFormat"
      DataObjectProperty="DurationFormat" />
  </ig:ProjectTaskPropertyMappingCollection>
</ig:ListBackedProject.TaskPropertyMappings>

完全なマッピング リストについては、コードコード例: ListBackedProject で xamGantt を XAML のカスタム タスク データにバインドを参照してください。

注:

Note

以下のマッピングは必須です。

  • DataItemId – タスクを一意で識別します。

  • Tasks – タスクの子タスクを保存します。

  • ConstraintType/ConstraintDate

  • DurationFormat – 期間の単位を指定し、その期間が過ぎ去った期間であるかどうかを追跡します。

注:

Note

タスクの進行状況をサポートしたい場合には以下のマッピングは必須です。

  • ActualStart および PercentComplete

  • または ActualStart および ActualDuration

注:

Note

手動タスクをサポートしたい場合には以下のマッピングは必須です。

  • IsManual

  • Start

  • Duration

  • Finish

注:

Note

タスク間のリンクを作成したい場合には以下のマッピングは必須です。

  • Predecessors

注:

Note

リソースを割り当てたい場合には以下のマッピングは必須です。

  • Resources

  1. 作成した ListBackedProject に xamGantt プロジェクト プロパティを設定する

既存の ListBackedProject に xamGantt Project プロパティを設定します。

XAML の場合:

<ig:XamGantt x:Name="gantt"
    Project="{Binding ElementName=dataProvider}" />

コード例

コード例の概要

以下の表には、このトピックのコード例が示されています。

説明

このコード例は、INotifyPropertyChanged インターフェイスを実装するクラスです。TaskModel クラスと ListBackedProjectViewModel クラスのいずれもこのクラスでプロパティの変更を知らせます。

このコード例はカスタム タスク モデルです。ObservableModel クラスを継承します。

このコード例は ViewModel クラスです。xml データの読み込みを処理し、ObservableModel クラスを継承します。

このコード例では、ListBackedProject を作成し、 xamGantt コントロールをデータに追加してバインドします。

コード例: 監視可能なモデル

説明

このコード例は、INotifyPropertyChanged インターフェイスを実装するクラスです。TaskModel クラスと ListBackedProjectViewModel クラスのいずれもこのクラスでクライアントにプロパティの変更を知らせます。

コード

C# の場合:

public class ObservableModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

Visual Basic の場合:

Public Class ObservableModel
    Implements INotifyPropertyChanged
    Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    Protected Overridable Sub NotifyPropertyChanged(ByVal propertyName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub
End Class

コード例: カスタム タスク モデル

説明

このコード例はカスタム タスク Model です。ObservableModel クラスを継承します。

リソースとサブタスクをコンマ区切りの文字列として追加できます。サブタスクの場合、入力するコンマ区切りの文字列値は、ListBackedProject の基になる ProjectTaskのDataItemId プロパティにマップするプロパティと一致する必要があります。コンマで区切られた文字列値を介して先行バージョンも追加する必要があります。

コード

C# の場合:

using Infragistics.Controls.Schedules;
public class TaskModel : ObservableModel
{
    private string _taskId;
    public string TaskID
    {
        get
        {
            return _taskId;
        }
        set
        {
            if (_taskId != value)
            {
                _taskId = value;
                this.NotifyPropertyChanged("TaskID");
            }
        }
    }
    private string _tasks;
    public string Tasks
    {
        get
        {
            return _tasks;
        }
        set
        {
            if (_tasks != value)
            {
                _tasks = value;
                this.NotifyPropertyChanged("Tasks");
            }
        }
    }
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (_name != value)
            {
                _name = value;
                this.NotifyPropertyChanged("Name");
            }
        }
    }
    private ProjectTaskConstraintType _constraintType;
    public ProjectTaskConstraintType ConstraintType
    {
        get
        {
            return _constraintType;
        }
        set
        {
            if (_constraintType != value)
            {
                _constraintType = value;
                this.NotifyPropertyChanged("ConstraintType");
            }
        }
    }
    private DateTime? _constraintDate;
    public DateTime? ConstraintDate
    {
        get
        {
            return _constraintDate;
        }
        set
        {
            if (_constraintDate != value)
            {
                _constraintDate = value;
                this.NotifyPropertyChanged("ConstraintDate");
            }
        }
    }
    private ProjectDurationFormat _durationFormat;
    public ProjectDurationFormat DurationFormat
    {
        get
        {
            return _durationFormat;
        }
        set
        {
            if (_durationFormat != value)
            {
                _durationFormat = value;
                this.NotifyPropertyChanged("DurationFormat");
            }
        }
    }
    private TimeSpan _durationInHours;
    public TimeSpan DurationInHours
    {
        get
        {
            return _durationInHours;
        }
        set
        {
            if (_durationInHours != value)
            {
                _durationInHours = value;
                this.NotifyPropertyChanged("DurationInHours");
            }
        }
    }
    private DateTime _start;
    public DateTime Start
    {
        get
        {
            return _start;
        }
        set
        {
            if (_start != value)
            {
                _start = value;
                this.NotifyPropertyChanged("Start");
            }
        }
    }
    private bool _isMilestone = false;
    public bool IsMilestone
    {
        get
        {
            return _isMilestone;
        }
        set
        {
            if (_isMilestone != value)
            {
                _isMilestone = value;
                this.NotifyPropertyChanged("IsMilestone");
            }
        }
    }
    private bool _isInProgress = true;
    public bool IsInProgress
    {
        get
        {
            return _isInProgress;
        }
        set
        {
            if (_isInProgress != value)
            {
                _isInProgress = value;
                this.NotifyPropertyChanged("IsInProgress");
            }
        }
    }
    private DateTime? _deadlineDate;
    public DateTime? DeadlineDate
    {
        get
        {
            return _deadlineDate;
        }
        set
        {
            if (_deadlineDate != value)
            {
                _deadlineDate = value;
                this.NotifyPropertyChanged("DeadlineDate");
            }
        }
    }
    private bool _isUndetermined = false;
    public bool IsUndetermined
    {
        get
        {
            return _isUndetermined;
        }
        set
        {
            if (_isUndetermined != value)
            {
                _isUndetermined = value;
                this.NotifyPropertyChanged("IsUndetermined");
            }
        }
    }
    private string _resourceName;
    public string ResourceName
    {
        get
        {
            return _resourceName;
        }
        set
        {
            if (_resourceName != value)
            {
                _resourceName = value;
                this.NotifyPropertyChanged("ResourceName");
            }
        }
    }
}

Visual Basic の場合:

Imports Infragistics.Controls.Schedules
Public Class TaskModel
    Inherits ObservableModel
    Private _taskId As String
    Public Property TaskID() As String
        Get
            Return _taskId
        End Get
        Set(value As String)
            If _taskId <> value Then
                _taskId = value
                Me.NotifyPropertyChanged("TaskID")
            End If
        End Set
    End Property
    Private _tasks As String
    Public Property Tasks() As String
        Get
            Return _tasks
        End Get
        Set(value As String)
            If _tasks <> value Then
                _tasks = value
                Me.NotifyPropertyChanged("Tasks")
            End If
        End Set
    End Property
    Private _name As String
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(value As String)
            If _name <> value Then
                _name = value
                Me.NotifyPropertyChanged("Name")
            End If
        End Set
    End Property
    Private _constraintType As ProjectTaskConstraintType
    Public Property ConstraintType() As ProjectTaskConstraintType
        Get
            Return _constraintType
        End Get
        Set(value As ProjectTaskConstraintType)
            If _constraintType <> value Then
                _constraintType = value
                Me.NotifyPropertyChanged("ConstraintType")
            End If
        End Set
    End Property
    Private _constraintDate As System.Nullable(Of DateTime)
    Public Property ConstraintDate() As System.Nullable(Of DateTime)
        Get
            Return _constraintDate
        End Get
        Set(value As System.Nullable(Of DateTime))
            If _constraintDate <> value Then
                _constraintDate = value
                Me.NotifyPropertyChanged("ConstraintDate")
            End If
        End Set
    End Property
    Private _durationFormat As ProjectDurationFormat
    Public Property DurationFormat() As ProjectDurationFormat
        Get
            Return _durationFormat
        End Get
        Set(value As ProjectDurationFormat)
            If _durationFormat <> value Then
                _durationFormat = value
                Me.NotifyPropertyChanged("DurationFormat")
            End If
        End Set
    End Property
    Private _durationInHours As TimeSpan
    Public Property DurationInHours() As TimeSpan
        Get
            Return _durationInHours
        End Get
        Set(value As TimeSpan)
            If _durationInHours <> value Then
                _durationInHours = value
                Me.NotifyPropertyChanged("DurationInHours")
            End If
        End Set
    End Property
    Private _start As DateTime
    Public Property Start() As DateTime
        Get
            Return _start
        End Get
        Set(value As DateTime)
            If _start <> value Then
                _start = value
                Me.NotifyPropertyChanged("Start")
            End If
        End Set
    End Property
    Private _isMilestone As Boolean = False
    Public Property IsMilestone() As Boolean
        Get
            Return _isMilestone
        End Get
        Set(value As Boolean)
            If _isMilestone <> value Then
                _isMilestone = value
                Me.NotifyPropertyChanged("IsMilestone")
            End If
        End Set
    End Property
    Private _isInProgress As Boolean = True
    Public Property IsInProgress() As Boolean
        Get
            Return _isInProgress
        End Get
        Set(value As Boolean)
            If _isInProgress <> value Then
                _isInProgress = value
                Me.NotifyPropertyChanged("IsInProgress")
            End If
        End Set
    End Property
    Private _deadlineDate As System.Nullable(Of DateTime)
    Public Property DeadlineDate() As System.Nullable(Of DateTime)
        Get
            Return _deadlineDate
        End Get
        Set(value As System.Nullable(Of DateTime))
            If _deadlineDate <> value Then
                _deadlineDate = value
                Me.NotifyPropertyChanged("DeadlineDate")
            End If
        End Set
    End Property
    Private _isUndetermined As Boolean = False
    Public Property IsUndetermined() As Boolean
        Get
            Return _isUndetermined
        End Get
        Set(value As Boolean)
            If _isUndetermined <> value Then
                _isUndetermined = value
                Me.NotifyPropertyChanged("IsUndetermined")
            End If
        End Set
    End Property
    Private _resourceName As String
    Public Property ResourceName() As String
        Get
            Return _resourceName
        End Get
        Set(value As String)
            If _resourceName <> value Then
                _resourceName = value
                Me.NotifyPropertyChanged("ResourceName")
            End If
        End Set
    End Property
End Class

コード例: ViewModel クラス

説明

このコード例は ViewModel クラスです。xml データの読み込みを処理し、ObservableModel クラスを継承します。

TaskModel オブジェクトの ObservableCollection 型の公開プロパティ Tasks を作成して XML ファイルのデータでポピュレートします。このコードは XElementExtension クラスの拡張メソッドを使用します。

コード

C# の場合:

using Infragistics.Controls.Schedules;
public class ListBackedProjectViewModel : ObservableModel
{
    public ListBackedProjectViewModel()
    {
        this.DownloadDataSource();
    }
    private ObservableCollection<TaskModel> _tasks;
    public ObservableCollection<TaskModel> Tasks
    {
        get
        {
            return _tasks;
        }
        set
        {
            if (value != null)
            {
                _tasks = value;
            }
            NotifyPropertyChanged("Tasks");
        }
    }
    private void DownloadDataSource()
    {
        ObservableCollection<TaskModel> dataSource = new ObservableCollection<TaskModel>();
        XDocument xmlDoc = XDocument.Load("TaskData.xml");
        IEnumerable<XElement> elements = xmlDoc.Root.Elements();
        foreach (XElement el in elements)
        {
            TaskModel task = new TaskModel();
            task.TaskID = el.Element("TaskID").GetString();
            task.Name = el.Element("Name").GetString();
            task.IsInProgress = el.Element("IsInProgress").GetBool();
            task.Start = DateTime.Today.ToUniversalTime();
            task.IsMilestone = el.Element("IsMilestone").GetBool();
            task.DurationInHours = TimeSpan.FromHours(el.Element("DurationInHours").GetDouble());
            task.IsUndetermined = el.Element("IsUndetermined").GetBool();
            task.ResourceName = el.Element("ResourceName").GetString();
            task.DurationFormat = ProjectDurationFormat.Days;
            if (el.Element("DeadlineDateInHours").GetInt() != 0)
            {
                task.DeadlineDate = DateTime.Today.AddHours(el.Element("DeadlineDateInHours").GetInt()).ToUniversalTime();
            }
            dataSource.Add(task);
        }
        this._tasks = dataSource;
    }
}

Visual Basic の場合:

Imports Infragistics.Controls.Schedules
Public Class ListBackedProjectViewModel
    Inherits ObservableModel
    Public Sub New()
        Me.DownloadDataSource()
    End Sub
    Private _tasks As ObservableCollection(Of TaskModel)
    Public Property Tasks() As ObservableCollection(Of TaskModel)
        Get
            Return _tasks
        End Get
        Set(value As ObservableCollection(Of TaskModel))
            If value IsNot Nothing Then
                _tasks = value
            End If
            NotifyPropertyChanged("Tasks")
        End Set
    End Property
    Private Sub DownloadDataSource()
        Dim dataSource As New ObservableCollection(Of TaskModel)()
        Dim xmlDoc As XDocument = XDocument.Load("TaskData.xml")
        Dim elements As IEnumerable(Of XElement) = xmlDoc.Root.Elements()
        For Each el As XElement In elements
            Dim task As New TaskModel()
            task.TaskID = el.Element("TaskID").GetString()
            task.Name = el.Element("Name").GetString()
            task.IsInProgress = el.Element("IsInProgress").GetBool()
            task.Start = DateTime.Today.ToUniversalTime()
            task.IsMilestone = el.Element("IsMilestone").GetBool()
            task.DurationInHours = TimeSpan.FromHours(el.Element("DurationInHours").GetDouble())
            task.IsUndetermined = el.Element("IsUndetermined").GetBool()
            task.ResourceName = el.Element("ResourceName").GetString()
            task.DurationFormat = ProjectDurationFormat.Days
            If el.Element("DeadlineDateInHours").GetInt() <> 0 Then
                task.DeadlineDate = DateTime.Today.AddHours(el.Element("DeadlineDateInHours").GetInt()).ToUniversalTime()
            End If
            dataSource.Add(task)
        Next
        Me._tasks = dataSource
    End Sub
End Class

コード例: ListBackedProject で xamGantt を XAML のカスタム タスク データにバインド

説明

このコード例では、ListBackedProject を作成し、 xamGantt コントロールをデータに追加してバインドします。

コード

XAML の場合:

Code
<Grid x:Name="LayoutRoot" Background="White">
  <Grid.Resources>
    <viewmodel:ListBackedProjectViewModel x:Key="viewmodel" />
  </Grid.Resources>
  <Grid.DataContext>
    <Binding Source="{StaticResource viewmodel}" />
  </Grid.DataContext>
  <ig:ListBackedProject x:Name="dataProvider"
                        TaskItemsSource="{Binding Tasks}">
    <ig:ListBackedProject.TaskPropertyMappings>
      <ig:ProjectTaskPropertyMappingCollection UseDefaultMappings="True">
        <ig:ProjectTaskPropertyMapping TaskProperty="DataItemId"
                                       DataObjectProperty="TaskID" />
        <ig:ProjectTaskPropertyMapping TaskProperty="Tasks"
                                       DataObjectProperty="Tasks" />
        <ig:ProjectTaskPropertyMapping TaskProperty="ConstraintType"
                                       DataObjectProperty="ConstraintType" />
        <ig:ProjectTaskPropertyMapping TaskProperty="ConstraintDate"
                                       DataObjectProperty="ConstraintDate" />
        <ig:ProjectTaskPropertyMapping TaskProperty="DurationFormat"
                                       DataObjectProperty="DurationFormat" />
        <ig:ProjectTaskPropertyMapping TaskProperty="TaskName"
                                       DataObjectProperty="Name" />
        <ig:ProjectTaskPropertyMapping TaskProperty="Start"
                                       DataObjectProperty="Start" />
        <ig:ProjectTaskPropertyMapping TaskProperty="IsMilestone"
                                       DataObjectProperty="IsMilestone" />
        <ig:ProjectTaskPropertyMapping TaskProperty="IsActive"
                                       DataObjectProperty="IsInProgress" />
        <ig:ProjectTaskPropertyMapping TaskProperty="Duration"
                                       DataObjectProperty="DurationInHours" />
        <ig:ProjectTaskPropertyMapping TaskProperty="Deadline"
                                       DataObjectProperty="DeadlineDate" />
        <ig:ProjectTaskPropertyMapping TaskProperty="IsManual"
                                       DataObjectProperty="IsUndetermined" />
        <ig:ProjectTaskPropertyMapping TaskProperty="Resources"
                                       DataObjectProperty="ResourceName" />
      </ig:ProjectTaskPropertyMappingCollection>
    </ig:ListBackedProject.TaskPropertyMappings>
  </ig:ListBackedProject>
  <ig:XamGantt x:Name="gantt"
               Project="{Binding ElementName=dataProvider}"/>
</Grid>

このトピックについては、以下のトピックも参照してください。

トピック 目的

このトピックは、 xamGantt コントロールのデータ バインディングの概要を説明します。

このトピックでは、Project プロパティによって xamGantt コントロールをデータにバインドする方法を説明します。

このトピックでは、Microsoft Project™ 2010 XML ファイルに保存された、すでに作成済みのプロジェクト計画を xamGantt コントロールで読み込む方法について説明します。