无法在 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>