WPF には、視覚化を基になるデータから分離するためのデータ テンプレートの概念があります。ListView (他の ItemsControl と同様) は、ItemTemplate
プロパティを使用して項目のデータ テンプレートを提供します。これについては、ItemsControl のスタイリングとテンプレート化で読むことができます。
この単純な DataItem クラスを考えると
public class DataItem
{
public string ItemText { get; set; }
public Brush ItemBackground { get; set; }
}
そのクラスの非常に単純な DataTemplate には、Border と TextBlock コントロールのみが含まれる場合があります。
<ListView Name="listView">
<ListView.ItemTemplate>
<DataTemplate>
<Border Background="{Binding ItemBackground}">
<TextBlock Margin="4" Text="{Binding ItemText}"/>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
GridView を含む ListViewでは、次CellTemplate
の代わりに GridViewColumn を指定しItemTemplate
ます。
<ListView Name="listView">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border Background="{Binding ItemBackground}">
<TextBlock Margin="4" Text="{Binding ItemText}"/>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
これで、次のように DataItems を ListView に簡単に追加できます。
listView.Items.Add(new DataItem { ItemText = "Item 1", ItemBackground = Brushes.AliceBlue });
listView.Items.Add(new DataItem { ItemText = "Item 2", ItemBackground = Brushes.LemonChiffon });
listView.Items.Add(new DataItem { ItemText = "Item 3", ItemBackground = Brushes.LightCoral });
UI が DataItem オブジェクトの変更に反応するようにするには、DataItem クラスにINotifyPropertyChangedを実装する必要があります。
public class DataItem : INotifyPropertyChanged
{
...
}
Items
データと UI をより適切に分離するには、項目をListViewのコレクションに直接追加するのではなくItemsSource
、プロパティを type のプロパティにバインドしObservableCollection<DataItem>
ます。
<ListView ItemsSource="{Binding DataItems}">
...
</ListView>
このトピックの詳細については、データ バインディングの概要/コレクションへのバインディングを参照してください。