Wpf 单击数据绑定ComboBoxItem不会';t更新父组合框

Wpf 单击数据绑定ComboBoxItem不会';t更新父组合框,wpf,vb.net,.net-4.0,Wpf,Vb.net,.net 4.0,我正在将字典绑定到ComboBox ItemSource。所有东西都绑定正确,但是当我运行程序时,单击下拉列表,然后单击该项…什么都没有发生 其他有用的信息,当我单击每个项目的文本时,我可以看到文本周围有一个模糊的框/边框。如果我在框内单击,什么也不会发生。如果我在框外单击,事情会按预期进行。想法 我的xaml代码: <ComboBox Name="PayloadDrop"> <ComboBox.ItemTemplate> <ItemContain

我正在将字典绑定到ComboBox ItemSource。所有东西都绑定正确,但是当我运行程序时,单击下拉列表,然后单击该项…什么都没有发生

其他有用的信息,当我单击每个项目的文本时,我可以看到文本周围有一个模糊的框/边框。如果我在框内单击,什么也不会发生。如果我在框外单击,事情会按预期进行。想法

我的xaml代码:

<ComboBox Name="PayloadDrop">
   <ComboBox.ItemTemplate>
      <ItemContainerTemplate>
         <ComboBoxItem Tag="{Binding Path=Key}" 
             Content="{Binding Path=Value}" />
         </ItemContainerTemplate>
      </ComboBox.ItemTemplate>
</ComboBox>
下面是我的组合框的屏幕截图


我从未对ItemContainerTemplate有过太多的经验,但据我所知,DataTemplate的情况也一样。(没有提到资源、菜单基或状态栏)

您将KeyValuePair项的集合作为ItemsSource。KeyValuePair不是ComboBoxItem,所以ComboBox决定为其创建容器-ComboBoxItem。此容器需要一种显示项目数据的方法,并且您已经为此设置了ItemTemplate,因此在容器内创建了另一个ComboBoxItem。所以,在ComboBoxItem中有ComboBoxItem。外部ComboBoxItem与ComboBox连接,因此ComboBox接收单击。内部ComboBoxItem以模糊的边框显示,并且已断开连接,因此对单击事件没有反应。
有两种可能的方法可以更改xaml:为ItemTemplate使用正确的DataTemplate,或为ItemContainerStyle使用样式。据我所知,您的任务是显示值,但同时保留有关键(某种ID)的信息,因此您应该使用正确的数据模板:

<ComboBox x:Name="PayloadDrop">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Value, Mode=OneTime}"/>
                </DataTemplate>
            </ComboBox.ItemTemplate>
</ComboBox>


在这种情况下,组合框将只显示值。您可以使用SelectedValue属性访问它。SelectedItem属性将包含基础KeyValuePair。由于KeyValuePair不实现INotifyPropertyChanged,因此必须使用Mode=OneTime来避免内存泄漏。

您不需要在
数据模板中定义
ComboboxItem
,因为它将隐式创建

<ComboBox Name="PayloadDrop" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Tag="{Binding Path=Key}" Padding="0" Margin="0"
         Text="{Binding Path=Value}" >                       
                </TextBlock>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>


使用DataTemplate代替ItemContainerTemplate。什么都没有发生你是说所选的项目没有显示在组合框中?我说的“什么都没有发生”的意思是,字面上说,什么都不会发生。我的onclick事件都不会触发(上面的代码中没有显示),组合框中选定的项目不会更改为我单击的项目,下拉框也不会再次隐藏。基本上,你在上面看到的屏幕截图只是停留在那里…一旦我将代码从“ComboBoxItem”更改为“TextBlock”并将“Content”属性更改为“Text”,一切都开始正常工作。Uggg…将其从ComboxItem更改为TextBlock修复了它…浪费了太多时间…非常感谢。也要感谢@SamTheDev。显然我没有意识到comboboxitem是自动创建的。。。
<ComboBox Name="PayloadDrop" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Tag="{Binding Path=Key}" Padding="0" Margin="0"
         Text="{Binding Path=Value}" >                       
                </TextBlock>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>