组合框是一个 ItemsControl。所有 ItemsControls 都可以用项目或容器“硬编码”填充。
这会在组合框中添加一个新条目,并将字符串包装到一个 ItemsContainer 中,它是一个 ComboBoxItem。
<ComboBox>
<sys:string>Hello</string>
<ComboBox>
这里我们直接创建一个组合框项,并将其内容添加到值为“Hello”的字符串中
<ComboBox>
<ComboBoxItem Content="Hello"/>
<ComboBox>
两者在视觉上看起来相同。重要的是要理解,在第一种情况下,ComboBox 负责将我们的 ComboBox 未知类型字符串包装到 ComboBoxItem 中,并使用默认的 DataTemplate 来显示它。默认的 DataTemplate 将显示一个 TextBlock 并在给定的数据项上调用 ToString()。
现在要拥有动态数据,我们需要一个带有数据项的 ObservableCollection。
class Employee
{
public BitmapSource Picture {get;set;}
public string Name{get;set}
}
ObservableCollection<Employee> employees;
myComboBox.ItemsSource = employees;
我们有一个名为 Employee 的 DataClass,一个可观察的集合,其中包含我们的许多数据项,并将此集合设置为 ItemsSource。从此时起,我们的 Combobox 会监听这个集合的变化。就像添加和删除员工一样,并自动将新员工包装到 ComboBoxItem 中。一切都是自动完成的。我们唯一需要做的就是提供一个合适的 DataTemplate。组合框不知道如何“显示”员工,而这正是 DataTemplate 的用途。
<DataTemplate x:Key="employeeTemplate">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Picture}"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
我们知道一个员工被包裹在一个 ComboBoxItem 中,并且 ComboBoxItem 使用提供的 Datatemplate 来显示其数据,这意味着在 DataTemplate 内部我们可以使用 Binding 来访问数据项上的所有属性。
希望对您有所帮助。