带有CompositeCollection的WPF ComboBox - SelectedIndex不粘

cog*_*el0 4 c# wpf xaml

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

<ComboBox>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="All"></ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource AllBitsSource}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

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

如果我设置:

<ComboBoxItem Content="All" IsSelected="True"/>
Run Code Online (Sandbox Code Playgroud)

这完全被忽略了.

我也尝试过:

<ComboBox SelectedIndex="0">
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

我刚刚尝试用<CollectionContainer>另一个替换我的<ComboBoxItem>工作方式很好,即使他们仍然在里面<CompositeCollection>.

EDIT2:

图像显示问题所在:

图片

EDIT3:

AllBitsSource的代码:

XAML:

<Window.Resources>
    <CollectionViewSource x:Key="AllBitsSource" Source="{Binding Path=AllBits}" />
Run Code Online (Sandbox Code Playgroud)

代码背后:

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; }
}
Run Code Online (Sandbox Code Playgroud)

GetCurrentSettings() 被召唤 Main()

Nic*_*ick 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>
Run Code Online (Sandbox Code Playgroud)

代码背后:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    (sender as ComboBox).SelectedIndex = 0;
}
Run Code Online (Sandbox Code Playgroud)