我正在创建一个用户控件,其中有一个组合框。
<UserControl>
...
<ComboBox HorizontalAlignment="Stretch" Name="ReasonComboBox"
PlaceholderText="{x:Bind ComboBoxPlaceHolderLabel, Mode=OneWay}"
ItemsSource="{x:Bind ItemsSource}"
DisplayMemberPath="{x:Bind DisplayMemberPath, Mode=OneWay}"
SelectedIndex="{x:Bind SelectedIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</UserControl>
public int SelectedIndex
{
get => (int)GetValue(SelectedIndexProperty);
set => SetValue(SelectedIndexProperty, value);
}
public static readonly DependencyProperty SelectedIndexProperty = DependencyProperty.Register(
"SelectedIndex",
typeof(int),
typeof(ComboBoxInput),
new PropertyMetadata(false, new PropertyChangedCallback(OnSelectedIndexPropertyChanged)));
如果默认初始索引为-1,则一切正常。但如果我们将默认初始索引设置为另一个值,例如:3,组合框最终将始终选择索引 0 和索引 3。调试时,它显示项目 3 被选中,但 UI 也显示项目 0 被选中,如果您尝试单击项目 0,PropertyChanged 事件不会被调用,所以现在有办法选择项目 0。
如果它只是一个本机组合框,则更改初始索引可以正常工作。仅当我们尝试将 ComboBox 嵌入用户控件时才会发生此错误。
我查看了您的存储库,这是您问题的最小可重现代码:
<ComboBox SelectedIndex="2">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
<x:String>Item 1</x:String>
<x:String>Item 2</x:String>
<x:String>Item 3</x:String>
</ComboBox>
呈现:
根据文档:
ComboBox 使用 CarouselPanel 作为其 ItemsPanel。不支持使用不同的面板作为 ItemsPanel,并且可能会导致不良行为。
因此,不更改
ItemsPanel
可以解决您的问题。