2013年07月25日

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

   このエントリーをはてなブックマークに追加 Clip to Evernote
LINQクエリの結果をバインドする(1)」では、クエリの結果を直接 ItemsSourceに代入していましたが、今回は、このシーケンスを取得するプロパティ(例えばIEnumerable<object> 型)をもつクラスを定義して、コードビハインドにコードを書かずに、XAML側でバインドしています。

例えば、以下のようなMyColorsクラスをC#で定義します。
Colorsプロパティは、readonlyプロパティで匿名クラスのシーケンスを返します。

public class MyColors {
    public IEnumerable<object> Colors {
       get {
           var colornames = from color in typeof(Colors).GetProperties()
                            select new  {
                                Name = color.Name,
                                Color = (Color)color.GetValue(null, null)
                            };
           return colornames;
       }
    }
}

LINQのクエリ式は、匿名クラスのシーケンスを返しているので、IEnumerable<object> としています。バインドするだけならば、これで問題はありません。
もちろん、

public class ColorInfo {
   public string Name { get ; set ; }
   public Color Color { get ; set ; }
}

といったクラスを定義しても構いません。

XAMLは以下のようになります。

<Window x:Class="BindingLinqSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:BindingLinqSample"
        Title="MainWindow" Height="320" Width="220">
    <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>
    </Window.Resources>
    <Window.DataContext>
        <my:MyColors />
    </Window.DataContext>
    <Grid>
        <ListBox Margin="10,10,10,50" Name="listBox1" 
                 ItemTemplate="{StaticResource myTemplate}"
                 ItemsSource="{Binding Colors}"/>
        <Border Margin="15" VerticalAlignment="Bottom"
                BorderThickness="1" BorderBrush="Gray">
            <ContentControl
                ContentTemplate="{StaticResource myTemplate}"
                Content="{Binding SelectedItem, ElementName=listBox1}" />
        </Border>
    </Grid>
</Window>

DataTemplate の、{Binding Path=Color} や {Binding Path=Name} は、ColorやNameは、匿名クラスのプロパティとなっています。
こうすれば、コードビハインドにはコードを追加する必要はなくなります。

LinqBinding2

WPFサンプル・目次


 

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

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