WPF ComboBox SelectedItem未更新

时间:2009-10-22 09:04:43

标签: wpf combobox wpf-controls selecteditem

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

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

编辑:

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

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

答案 2 :(得分:0)

private void utc_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var items = e.AddedItems;
            ComboBoxItem utcSel = (ComboBoxItem)items[0];
            string utcStr = utcSel.Content.ToString();
        }