无法在 silverlight 中将集合绑定到 ComboBox
Unable to bind collection to ComboBox in silverlight
我有一个ObservableCollection
,当我想用CheckBox
显示这个ObservableCollection
时,我只是将内容绑定到CheckBox
但是当我想显示使用 ComboBox
相同的集合我无法做到这一点。有什么建议吗?
XAML: 显示集合使用CheckBox
--WORKS
<ItemsControl ItemsSource="{Binding Synonyms}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Margin="0,5,0,0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!--Display items in CheckBox-->
<CheckBox Content="{Binding Display}" Margin="10,0,0,0" /> // Display is the collection.
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
输出:
XAML:使用 ComboBox
显示集合 --NOTHING OVER HERE
<ItemsControl ItemsSource="{Binding Synonyms}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Margin="0,5,0,0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!--Display items in ComboBox.-->
Approach - 1
<ComboBox>
<ComboBoxItem Content="{Binding Display}"/>
</ComboBox>
Approach - 2
<ComboBox ItemsSource="{Binding Path=Synonyms}" DisplayMemberPath="Display"/>
Approach - 3
<ComboBox >
<ComboBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Green" BorderThickness="1" Padding="5">
<TextBlock Text="{Binding Path=Display,StringFormat='Display: {0}'}" />
</Border>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
输出:
我想在带有 Select 全部选项的 oneComboBox 中显示项目(一、二、三等)。我尝试了几种方法但没有。我在这里错过了什么?
与组合框不同,复选框并非设计用于容纳多个项目,因此实现为复选框设计的系统与组合框无关。
要解决您的问题,请从 ItemsControl
中删除组合框并使其独立:
<ComboBox ItemsSource="{Binding Synonyms}" DisplayMemberPath="Display"/>
它告诉组合框将其 ItemsSource
绑定到未指定的数据上下文,这很好,因此它随后获取其父级的数据上下文。该过程以 up 的方式工作到每个父级,直到它找到绑定的数据上下文(很可能是页面的数据上下文到 VM 实例)。
假设数据上下文在可视化树中的某个点有效,它将绑定到该实例并查找名为 Synonyms
的 属性。从 Synonyms
属性 它将使用 作为列表 来显示项目。
要在组合框中显示(显示)文本(而不是默认为项目的 ToString()
),组合框将显示来自项目 属性 Display
的字符串。
在一个下拉列表中给出项目列表。
简短的回答是,您应该使用 ComboBox 作为根元素,而不是 ItemsControl。 CompboBox 只是 ItemsControl 的一个特殊版本。
<ComboBox ItemsSource="{Binding Synonyms}" DisplayMemberPath="Display"/>
较长的答案。
ComboBox 派生自 ItemsControl,因此您可以获得基础 class 的所有功能,以及其他功能。
ItemsControl(及其派生的 classes)提供了一种在 UI 中重复一组数据的方法。 DataTemplate 是您为同义词源中的每个 "row" 数据指定 UI 的地方。
您正在做的是要求 Silverlight 为每个基础数据行创建一个单独的 ComboBox。
您仍然可以在 ComboBox 中使用 DataTemplate。像这样。
<ComboBox ItemsSource="{Binding Synonyms}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!--Display items in CheckBox-->
<TextBox Text="{Binding Display}"
Margin="10,0,0,0"
FontWeight="Bold" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我有一个ObservableCollection
,当我想用CheckBox
显示这个ObservableCollection
时,我只是将内容绑定到CheckBox
但是当我想显示使用 ComboBox
相同的集合我无法做到这一点。有什么建议吗?
XAML: 显示集合使用CheckBox
--WORKS
<ItemsControl ItemsSource="{Binding Synonyms}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Margin="0,5,0,0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!--Display items in CheckBox-->
<CheckBox Content="{Binding Display}" Margin="10,0,0,0" /> // Display is the collection.
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
输出:
XAML:使用 ComboBox
显示集合 --NOTHING OVER HERE
<ItemsControl ItemsSource="{Binding Synonyms}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Margin="0,5,0,0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!--Display items in ComboBox.-->
Approach - 1
<ComboBox>
<ComboBoxItem Content="{Binding Display}"/>
</ComboBox>
Approach - 2
<ComboBox ItemsSource="{Binding Path=Synonyms}" DisplayMemberPath="Display"/>
Approach - 3
<ComboBox >
<ComboBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Green" BorderThickness="1" Padding="5">
<TextBlock Text="{Binding Path=Display,StringFormat='Display: {0}'}" />
</Border>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
输出:
我想在带有 Select 全部选项的 oneComboBox 中显示项目(一、二、三等)。我尝试了几种方法但没有。我在这里错过了什么?
与组合框不同,复选框并非设计用于容纳多个项目,因此实现为复选框设计的系统与组合框无关。
要解决您的问题,请从 ItemsControl
中删除组合框并使其独立:
<ComboBox ItemsSource="{Binding Synonyms}" DisplayMemberPath="Display"/>
它告诉组合框将其 ItemsSource
绑定到未指定的数据上下文,这很好,因此它随后获取其父级的数据上下文。该过程以 up 的方式工作到每个父级,直到它找到绑定的数据上下文(很可能是页面的数据上下文到 VM 实例)。
假设数据上下文在可视化树中的某个点有效,它将绑定到该实例并查找名为 Synonyms
的 属性。从 Synonyms
属性 它将使用 作为列表 来显示项目。
要在组合框中显示(显示)文本(而不是默认为项目的 ToString()
),组合框将显示来自项目 属性 Display
的字符串。
在一个下拉列表中给出项目列表。
简短的回答是,您应该使用 ComboBox 作为根元素,而不是 ItemsControl。 CompboBox 只是 ItemsControl 的一个特殊版本。
<ComboBox ItemsSource="{Binding Synonyms}" DisplayMemberPath="Display"/>
较长的答案。
ComboBox 派生自 ItemsControl,因此您可以获得基础 class 的所有功能,以及其他功能。
ItemsControl(及其派生的 classes)提供了一种在 UI 中重复一组数据的方法。 DataTemplate 是您为同义词源中的每个 "row" 数据指定 UI 的地方。
您正在做的是要求 Silverlight 为每个基础数据行创建一个单独的 ComboBox。
您仍然可以在 ComboBox 中使用 DataTemplate。像这样。
<ComboBox ItemsSource="{Binding Synonyms}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!--Display items in CheckBox-->
<TextBox Text="{Binding Display}"
Margin="10,0,0,0"
FontWeight="Bold" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>