带有CompositeCollection的WPF ComboBox - SelectedIndex不粘

时间:2013-08-21 18:00:29

标签: c# wpf xaml

我正在使用带有CompositeCollection的ComboBox,如下所示:

<ComboBox>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="All"></ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource AllBitsSource}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

显示的数据完全符合预期,我现在只想将默认索引/值/项设置为包含内容All的ComboBoxItem,并且遇到一些问题。

如果我设置:

<ComboBoxItem Content="All" IsSelected="True"/>

这完全被忽略了。

我也尝试过:

<ComboBox SelectedIndex="0">

虽然这确实选择了All值,但是当我打开下拉列表时,突出显示的值是加载到ComboBox上的最后一个值,而不是All值。

如何解决这个问题,以便在数据绑定后保持我的ComboBoxItem内容被选中?

修改

我刚刚尝试用另一个<CollectionContainer>替换我的<ComboBoxItem>并且它正常工作,即使它们仍在<CompositeCollection>内。

EDIT2:

显示问题所在的图片:

Image

EDIT3:

AllBitsSource的代码:

XAML:

<Window.Resources>
    <CollectionViewSource x:Key="AllBitsSource" Source="{Binding Path=AllBits}" />

代码背后:

private readonly ObservableCollection<string> _bits = new ObservableCollection<string>();

private void GetCurrentSettings()
{
    setttings = display.GetDisplaySettings();

    foreach (var mode in setttings)
    {
        var displaySettingInfoArray = mode.GetInfoArray();

        if (_bits.Contains(displaySettingInfoArray[4]) == false)
        {
            _bits.Add(displaySettingInfoArray[4]);
        }
    }
}

public ObservableCollection<string> AllBits
{
    get { return _bits; }
}
GetCurrentSettings()

上调用

Main()

1 个答案:

答案 0 :(得分:6)

由于您在构建ComboBox后添加到Collection中,您可能需要进入Loaded事件并在那里设置SelectedIndex ...

<ComboBox Loaded="ComboBox_Loaded">
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="All" />
            <CollectionContainer Collection="{Binding Source={StaticResource AllBitsSource}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

代码背后:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    (sender as ComboBox).SelectedIndex = 0;
}