【问题标题】:WPF ComboBox SelectedItem not UpdatingWPF ComboBox SelectedItem 未更新
【发布时间】:2009-10-22 09:04:43
【问题描述】:

我在使用WPF ComboBox 时遇到问题。我的情况是我有一个显示一些值的组合框。我将 ContentControls 添加到 ComboBox 的 Items 属性中。我已将这些 ContentControl 的Content 绑定到某个数据源,以便我可以动态更改内容。问题是如果选择的项目的内容更改了 ComboBox 下拉更新中的项目,但 ComboBox SelectionChange 中的项目保持不变。

有什么建议吗?

【问题讨论】:

    标签: wpf combobox wpf-controls selecteditem


    【解决方案1】:

    不要直接在 ComboBox 内添加 ContentControl,而是使用 DataTemplate(ItemsTemplate) 或 ItemContainerStyle。因为自动生成的 ComboBoxItem 不知道您的点击,因为 ContentControl 吃掉了 Mousedown 并隐藏了 ComboboxItem。 ComboBox 项负责设置 IsSelectedProperty 并触发 SelectionChanged 发生。

    【讨论】:

      【解决方案2】:

      我已经用不同的方式解决了这个问题。
      ComboBox SelectedItem 不是它显示的内容,而是您选择的内容。当您选择一个项目组合框时,组合框将其显示在选择框的模板中,而不是在 SelectedItem 的模板中。如果您进入 ComboBox 的 VisualTree,您会看到它有一个 ContentPresenter,其中包含一个 TextBlock,并且此 TextBlock 被分配了所选项目的文本。
      所以我做了什么,在 SelectionChanged 事件处理程序中,我使用 VisualTreeHelper 在 ContentPresenter 中查找 TextBlock 然后我将此 TextBlock 的 Text 属性绑定到我的 ContentControl(SelectedItem) 的 Content 属性。

      编辑:

      在 ComboBox 的 SelectionChanged 事件处理程序中,我写道:

      ModifyCombox(cmbAnimationBlocks, myComboBox.SelectedItem.As<ContentControl>());
      

      这个方法是:

          private static void ModifyCombox(DependencyObject comboBox, ContentControl obj)
          {
              if (VisualTreeHelper.GetChildrenCount(comboBox) > 0)
              {
                  WalkThroughElement(comboBox, obj);
              }
          }
      
          private static void WalkThroughElement(DependencyObject element, ContentControl contentControl)
          {
              for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
              {
                  if (element.GetType() == typeof(ContentPresenter))
                  {
                      ContentPresenter contentPresenter = element.As<ContentPresenter>();
                      TextBlock textBlock = VisualTreeHelper.GetChild(contentPresenter, 0).As<TextBlock>();
                      textBlock.SetBinding(TextBlock.TextProperty, new Binding("Content")
                      {
                          Source = contentControl
                      });
                      contentPresenter.Content = textBlock;
                  }
                  else
                  {
                      DependencyObject child = VisualTreeHelper.GetChild(element, i).As<FrameworkElement>();
                      WalkThroughElement(child, contentControl);
                  }
              }
      
              if (VisualTreeHelper.GetChildrenCount(element) == 0 && element.GetType() == typeof(ContentPresenter))
              {
                  ContentPresenter contentPresenter = element.As<ContentPresenter>();
                  TextBlock textBlock = new TextBlock();
                  textBlock.SetBinding(TextBlock.TextProperty, new Binding("Content")
                  {
                      Source = contentControl
                  });
                  contentPresenter.Content = textBlock;
              }
          }
      

      【讨论】:

      • 代码示例会很有帮助。
      【解决方案3】:
      private void utc_SelectionChanged(object sender, SelectionChangedEventArgs e)
              {
                  var items = e.AddedItems;
                  ComboBoxItem utcSel = (ComboBoxItem)items[0];
                  string utcStr = utcSel.Content.ToString();
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        • 2023-03-09
        • 1970-01-01
        • 2011-01-10
        • 2012-06-19
        • 1970-01-01
        • 2011-11-01
        相关资源
        最近更新 更多