wpf - 单击数据绑定(bind) ComboBoxItem 不会更新父 ComboBox

标签 wpf vb.net .net-4.0

我正在将字典绑定(bind)到 ComboBox ItemSource。一切都正确绑定(bind),但是当我运行程序时,单击下拉菜单,然后单击该项目......什么也没有发生。

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

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

最佳答案

我对 ItemContainerTemplate 从来没有太多的经验,但据我了解,DataTemplate 的情况也是如此。 (没有提及资源或 MenuBase 或 StatusBar)

您有 KeyValuePair 项目的集合作为 ItemsSource。 KeyValuePair 不是 ComboBoxItem,因此 ComboBox 决定为其创建容器 - ComboBoxItem。该容器需要一种显示项目数据的方法,并且您已为此设置了 ItemTemplate,因此在容器内创建了另一个 ComboBoxItem。因此,ComboBoxItem 中有 ComboBoxItem。外部 ComboBoxItem 与 ComboBox 连接,因此 ComboBox 接收点击。内部 ComboBoxItem 显示为淡边框且断开连接,因此对单击事件没有反应。
有两种可能的方法可以更改 xaml:为 ItemTemplate 使用正确的 DataTemplate,或为 ItemContainerStyle 使用 Style。据我了解,您的任务是显示值,但同时保留有关 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来避免内存泄漏。

关于wpf - 单击数据绑定(bind) ComboBoxItem 不会更新父 ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481011/

相关文章:

wpf - WPF DatePicker 奇怪的外观

vb.net - 保持来自 redis 服务器的响应对每个连接的客户端都是唯一的

wpf - 容器用户控件中的数据绑定(bind)

wpf - 你能制作多线程动画吗?如何提高动画性能

WPF - 在具有自定义复选框样式的 DataGrid 中无法使用 IsReadOnly

vb.net - Me.Close 不起作用

c# - LINQ 获取 TreeView 中最深层次的节点

c# - Linq-to-SQL - 采取不工作

asp.net - Entity Framework 5 + EntityDataSource + ASP.NET + .NET 4.0 找不到 CLR 类型

c# - 从 View 模型的构造函数调用异步方法