无法将集合绑定到Silverlight中的ComboBox

时间:2015-05-26 15:07:52

标签: c# xaml silverlight combobox

我有一个ObservableCollection,当我想用​​ObservableCollection显示这个CheckBox时,我只是将内容绑定到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>

输出:

enter image description here

XAML:使用ComboBox显示集合 - 不在此处

<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>

输出:

enter image description here

我想在oneComboBox中使用Select All选项显示项目(一,二,三等)。我尝试了几种方法,但没有。我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

与Combobox不同,该复选框不能容纳多个项目,因此实现为复选框设计的系统与组合框无关。

要解决您的问题,请从ItemsControl中移除组合框并使其独立:

<ComboBox ItemsSource="{Binding Synonyms}" DisplayMemberPath="Display"/>

告诉组合框将其ItemsSource绑定到未指定的数据上下文,这是好的,因此它获取它的父级数据上下文。该过程以 up 的方式运行到每个父节点,直到找到绑定的数据上下文(很可能是页面对VM实例的datacontext)。

假设数据上下文在可视树中的某个点有效,它将绑定到该实例并查找名为Synonyms的属性。从Synonyms属性中,它将使用作为列表来显示项目。

要在组合框中显示(显示)文本(而不是默认为项目的ToString()),组合框将显示项目属性Display中的字符串。

在一个下拉列表中提供项目列表。

答案 1 :(得分:1)

简短的回答是,您应该使用 ComboBox 作为根元素,而不是 ItemsControl 。 CompboBox只是ItemsControl的专用版本。

<ComboBox ItemsSource="{Binding Synonyms}" DisplayMemberPath="Display"/>

答案越长。

ComboBox派生自ItemsControl,因此您可以获得基类的所有功能以及其他功能。

ItemsControl(及其派生类)提供了一种在UI中重复一组数据的方法。您可以在DataTemplate中为每个&#34; row&#34;指定所需的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>