たとえば、次のような非常にシンプルなウィンドウがあるとします。
<Window x:Class="CalendarGenerator.Window1"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="447">
<Grid>
<ListBox Margin="12,40,0,12"
Name="eventList"
HorizontalAlignment="Left"
Width="134" />
</Grid>
</Window>
そして、次のように定義された単純なリスト:
List<String> ListOfNames = new List<String>();
そして、リストにいくつかの名前があると仮定しましょう。可能な限り多くのコードビハインドを使用して、ListをListBoxにバインドするにはどうすればよいですか?
まず、コードビハインドからアクセスできるように、ListBoxに名前を付ける必要があります(edit私はすでにこれを実行しているので、サンプルのListBoxを変更しますあなたを反映する名前):
<ListBox x:Name="eventList" ... />
次に、ListBoxの ItemsSource プロパティをリストに設定するだけです。
eventList.ItemsSource = ListOfNames;
「ListOfNames」オブジェクトをList<String>
として定義したので、ListBoxはリストに加えられた変更を自動的に反映しません。リスト内の変更に反応するWPFのデータバインディングを取得するには、代わりに ObservableCollection<String>
として定義します。
データリストがコードで作成されている場合は、次のようにコードでバインドする必要があります。
eventList.ItemsSource = ListOfNames;
文字列のリストへのバインドは非常に単純な例です。もっと複雑なものを見てみましょう。
あなたが人のクラスを持っているとしましょう:
public class Person {
public string FirstName { get; set; }
public string Surname { get; set; }
}
人物のリストを表示するには、リストをListBoxにバインドできますが、WPFに人物オブジェクトの表示方法を伝えていないため、リストボックスには各エントリの「人物」が表示されます。
データオブジェクトを視覚的に表示する方法をWPFに伝えるには、次のようにDataTemplateを定義します。
<Window.Resources>
<DataTemplate DataType="{x:Type l:Person}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Surname}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox Name="listBox" />
</Grid>
public Window1() {
InitializeComponent();
List<Person> people = new List<Person>();
people.Add(new Person() { FirstName = "Cameron", Surname = "MacFarland" });
people.Add(new Person() { FirstName = "Bea", Surname = "Stollnitz" });
people.Add(new Person() { FirstName = "Jason", Surname = "Miesionczek" });
listBox.ItemsSource = people;
}
これにより、リストに「Firstname Surname」が適切に表示されます。
外観を "姓、名"に変更したい場合は、XAMLを次のように変更するだけです。
<StackPanel Orientation="Horizontal">
<TextBlock FontWeight="Bold" Text="{Binding Surname}"/>
<TextBlock Text=", "/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
バインディングをカスタマイズする場合は、 Binding クラスを使用します。
List<String> listOfNames = new List<String>() {"a", "b"};
Binding myBinding = new Binding();
//set binding parameters if necessary
myBinding.Source = listOfNames;
eventList.SetBinding(ItemsControl.ItemsSourceProperty, myBinding);
または
データをItemsSourceプロパティに直接割り当てます。
eventList.ItemsSource = listOfNames;
eventList.ItemsSource = ListOfNames;