单击数据绑定ComboBoxItem不会更新父ComboBox

时间:2015-07-17 16:59:39

标签: wpf vb.net .net-4.0

我将字典绑定到ComboBox ItemSource。一切都正常绑定,但是当我运行程序时,单击下拉菜单,然后单击该项目......没有任何反应。

其他有用的信息,当我点击每个项目的文本时,我可以在文本周围看到一个微弱的框/边框。如果我在框内单击,则没有任何反应。如果我在框外单击,事情就会按预期工作。想法?

我的xaml代码:

<ComboBox Name="PayloadDrop">
   <ComboBox.ItemTemplate>
      <ItemContainerTemplate>
         <ComboBoxItem Tag="{Binding Path=Key}" 
             Content="{Binding Path=Value}" />
         </ItemContainerTemplate>
      </ComboBox.ItemTemplate>
</ComboBox>

我的代码背后:

Dim PayloadDictionary As New Dictionary(Of Int16, String) From _
        {{0, "Some payload text"}, {1, "Path to a payload file"}}

PayloadDrop.ItemsSource = PayloadDictionary

下面是我的组合框的截图...

screenshot

2 个答案:

答案 0 :(得分:2)

我从未有过使用ItemContainerTemplate的经验,但据我所知,案例与DataTemplate的情况相同。 (没有提及Resources或MenuBase或StatusBar)

您有KeyValuePair项目的集合作为ItemsSource。 KeyValuePair不是ComboBoxItem,因此ComboBox决定为它创建容器 - ComboBoxItem。此容器需要一种显示项目数据的方法,并且您已为此设置了ItemTemplate,因此在容器内创建了另一个 ComboBoxItem。所以,你在ComboBoxItem中有ComboBoxItem。外部ComboBoxItem与ComboBox连接,因此ComboBox接收点击。内部ComboBoxItem显示为带有微弱边框并且已断开连接,因此对单击事件没有任何反应。  
有两种方法可以更改你的xaml:使用正确的DataTemplate for ItemTemplate,或Style for ItemContainerStyle。据我了解,您的任务是显示Value但保留有关Key(某种ID)的信息,因此您应该使用正确的DataTemplate:

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

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

答案 1 :(得分:1)

您不需要在ComboboxItem内定义DataTemplate,因为它会隐式创建

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