SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Infragistics NetAdvantageチュートリアル(AD)

Silverlightでのツリー表示(その1): 標準TreeViewコントロールとNetAdvantage XamDataTreeコントロール

  • このエントリーをはてなブックマークに追加

ItemsControl

 さて、先ほどご説明したとおり、今回の本題の一つ目であるTreeViewコントロールはItemsControlと呼ばれるクラスの派生クラスになります。

 ItemsControlは前述したコンテンツモデルのコントロールの中でも「項目のコレクション」となっていることから分かるように配列List<T>などのコレクションオブジェクトを取り扱うことができるコントロールです。

 そのため、コレクションを取り扱うためのコンテンツプロパティとして、ItemsプロパティItemsSourceプロパティが用意されています。それぞれの利用方法について順番に説明します。

Itemsプロパティ

 ItemsプロパティはItemCollection型で、その名前のとおりItemsControlに表示する任意オブジェクトのコレクションを格納・管理するプロパティとなっています。

 つまり、ItemsControlに対して、任意オブジェクトの追加・参照・削除が行えます。

 ItemCollectionクラスのAddメソッド, Removeメソッドなどを使って個々のデータの追加・削除が行えます。

 それでは早速TreeViewコントロールを使って、Itemsプロパティによる、追加・削除を行うサンプルプログラムを見てみましょう。

List1:Itemsプロパティによる追加と削除(XAML)
<UserControl x:Class="_01_TreeViewItemsProperty.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Button Content="Add" Name="btnAdd" Margin="5" Click="btnAdd_Click" />
        <Button Content="Remove" Grid.Column="1" Name="btnRemove" Margin="5" Click="btnRemove_Click" />
        
        <sdk:TreeView Name="treeView1" Grid.Row="1" Grid.ColumnSpan="2" Margin="5" />
    </Grid>
</UserControl>

 また、Buttonコントロールのイベントハンドラの実装が必要となりますので、コードビハインドは以下のように実装します。

LIST2:Itemsプロパティによる追加と削除(C#)
/// <summary>
/// Addボタンイベントハンドラ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
    //ItemsプロパティのAddメソッド
    treeView1.Items.Add(string.Format("Item {0}", treeView1.Items.Count));
}

/// <summary>
/// Removeボタンイベントハンドラ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnRemove_Click(object sender, RoutedEventArgs e)
{
    //カウンターが0となれば実行しない
    if (treeView1.Items.Count <= 0) return;

    //Itemsプロパティのデータの削除
    treeView1.Items.RemoveAt(treeView1.Items.Count - 1);
}

 実行結果は以下のような形になります。

 まだ、単一のコレクションオブジェクトを追加しただけなので、階層表示は行われませんが、Addボタン、Removeボタンをクリックすることで、ItemsControlの項目の追加・削除が行われる様子は確認できると思います。

ItemsSourceプロパティ

 前述のように1つずつオブジェクトをItemsプロパティに追加する以外にもすでに存在する配列やListなどのコレクションオブジェクトをコントロールに直接指定するプロパティが用意されています。それがItemsSourceプロパティです。

 ItemsSourceプロパティにはIEnumerableインターフェースを実装したコレクションオブジェクトを指定できます。

 IEnumerableインターフェースは.NETでの配列の親クラスであるArrayクラスやSystem.Collection名前空間などにある主要なコレクションオブジェクトで実装されていることから、これらのコレクションオブジェクトはItemsSourceプロパティにそのまま指定できます。

 本日の本題であるTreeViewコントロール、XamTreeDataコントロールはいずれもItemsSourceプロパティを持っています。

 それでは、早速コレクションオブジェクトを表示するためのサンプルプログラムを見てみましょう。

 こちらのサンプルプログラムはXamDataTreeを利用していますので、プロジェクトで「参照の追加」するなど、関連コンポーネントを追加する必要がありますが、先ほどご紹介したNetAdvantageはインストールされているとツールボックスに表示されますので、ドラッグ&ドロップだけで簡単にXAMLに追加することができます。

 最終的には以下のようにTreeViewコントロール、XamDataTreeコントロールを追加し、UserControlへLoadedイベントを追加します。

LIST3:ItemsSouceプロパティへコレクションオブジェクトを設定(XAML)
<UserControl x:Class="_02_ItemsSource.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
    xmlns:ig="http://schemas.infragistics.com/xaml"
    Loaded="UserControl_Loaded">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <sdk:TreeView Name="treeView1" />
        <ig:XamDataTree Grid.Column="1" Name="xamDataTree1" />
    </Grid>
</UserControl>

 Loadedイベントハンドラは以下のようにLINQを使ってstring型のコレクションオブジェクトを生成し、各コントロールのItemsSourceプロパティに設定します。

LIST4:ItemsSouceプロパティへコレクションオブジェクトを設定(C#)
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    var stringItems = Enumerable.Range(1, 10).Select(i => string.Format("Item {0}", i));

    treeView1.ItemsSource       = stringItems;
    xamDataTree1.ItemsSource    = stringItems;
}

 実行結果は以下のとおりです。

 それぞれのコントロールの描画方法が異なることから若干表示されるイメージが異なりますが、いずれも同じように各項目を表示できます。

 また、XamDataTreeコントロールでは、特定のエンティティクラスなどを指定する場合、DisplayMemberPathプロパティにプロパティパスを設定することで表示項目を指定できます。

 それではサンプルとして以下のようなエンティティクラスを定義します。

LIST5:特定のエンティティクラス(C#)
public class Person
{
    public string Name { get; set; }

    private ObservableCollection<Person> _children = new ObservableCollection<Person>();

    public ObservableCollection<Person> Children
    {
        get { return _children; }
    }
}

 そして、XAMLは以下のように作成します。

LIST6:DisplayMemberPathの設定(XAML)
<UserControl x:Class="_03_DisplayMemberPath.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
    xmlns:ig="http://schemas.infragistics.com/xaml"
    Loaded="UserControl_Loaded">

    <Grid x:Name="LayoutRoot" Background="White">
        <ig:XamDataTree Grid.Column="1" Name="xamDataTree1" 
                        DisplayMemberPath="PersonName" />
    </Grid>
</UserControl>

 そして、前のサンプル同様、Loadedイベントに対して上記エンティティクラスを表示するために以下のようにコーディングします。

LIST7:特定エンティティクラスの表示(C#)
private ObservableCollection<Person> persons;

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    persons = new ObservableCollection<Person>
                    {
                        new Person { PersonName = "しるば太郎" },
                        new Person { PersonName = "しるば次郎" },
                        new Person { PersonName = "しるば三郎" },
                        new Person { PersonName = "しるば四郎" },
                        new Person { PersonName = "しるば五郎" }
                    };

    xamDataTree1.ItemsSource    = persons;
}

 実行結果は以下のように表示されます。

次のページ
階層構造の表示

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Infragistics NetAdvantageチュートリアル連載記事一覧

もっと読む

この記事の著者

森 博之(AZPower株式会社)(モリ ヒロユキ)

 Microsoft Azure、.NETテクノロジーを使用したWebサービスのプロダクトアーキテクト。他にも技術記事の執筆やトレーニング、セミナースピーカーを行っている。 Microsoft MVPをDeveloper Technologies、Visual Studio and Development Technologies、Windows Development、Client App Dev、.NET、Silverlight、Visual C#などのコン...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5772 2011/04/08 12:15

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング