2013年07月23日

WPFサンプル:LINQクエリの結果をバインドする(1)

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQ to Objectのクエリの結果(ここでは、匿名クラスのシーケンス)をListBoxにバインドするサンプルを示します。
以下、そのスクリーンショットです。

LinqBinding1

C# のコードはいたって簡単。
typeof(Colors).GetProperties() でColorsに定義されているプロパティ一覧を取得し、Name と Color の情報を抜出し、そのシーケンスを求めています。
このLINQクエリの結果をLIstBox.ItemsSourceにバインドしているだけです。

以下、C#のソースを示します。

using System.Linq;
using System.Windows;
using System.Windows.Media;
namespace BindingLinqSample {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            var colorinfos = from color in typeof(Colors).GetProperties()
                             select new {
                                 Name = color.Name,
                                 Color = color.GetValue(null, null)
                             };
            listBox1.ItemsSource = colorinfos;
        }
    }
}

なお、XAMLでは、ListBoxの各行に実際の色と色の名前を表示するために、DataTemplateを利用しています。
今回の例では、匿名クラスには、NameとColorというプロパティが存在しますが、DatTemplateを使うことで、Nameを表示するのか、Colorを表示するのか、はたまた両方を表示するのか、そしてそれをどう表示するのかを定義することができます。
XAML側でも、匿名クラスのプロパティである Name, Colorプロパティを参照している点に注目してください。


<Window x:Class="BindingLinqSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="320" Width="240">
    <Window.Resources>
        <DataTemplate x:Key="myTemplate">
            <StackPanel Orientation="Horizontal">
                <Rectangle Width="30" Margin="2" >
                    <Rectangle.Fill>
                        <SolidColorBrush Color="{Binding Path=Color}" />
                    </Rectangle.Fill>
                </Rectangle>
                <TextBlock Text="{Binding Path=Name}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="myTemplate2">
                <TextBlock Text="{Binding Path=Name}" />
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox Margin="15,15,15,45" Name="listBox1" 
                 ItemTemplate="{StaticResource myTemplate}" />
        <Border Margin="15" VerticalAlignment="Bottom"
                BorderThickness="1" BorderBrush="Gray">
            <ContentControl
                    ContentTemplate="{StaticResource myTemplate}"
                    Content="{Binding SelectedItem, ElementName=listBox1}" />
        </Border>
    </Grid>
</Window>


WPFサンプル・目次


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52329600