ComboBox关闭下拉框时如何显示AlternationIndex?
解决WPF ComboBox选中后显示索引+值的问题
方法一:包装数据源(推荐)
AlternationIndex依赖控件项的排列顺序生成,一旦数据源发生排序、过滤或动态更新,索引会和数据实际位置不匹配。更稳妥的方式是先把原始数据源包装成包含索引和值的实体类:
1. 创建实体类
public class IndexedDouble { public int Index { get; set; } public double Value { get; set; } }
2. 转换数据源
在ViewModel中将DoubleList转换为带索引的集合:
public List<IndexedDouble> IndexedDoubleList { get; set; } // 初始化时完成转换 IndexedDoubleList = DoubleList.Select((val, idx) => new IndexedDouble { Index = idx, Value = val }).ToList();
3. 修改ComboBox的XAML
此时下拉项和选中后的显示都能直接绑定索引与值:
<ComboBox ItemsSource="{Binding IndexedDoubleList}"> <!-- 下拉项显示模板 --> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock> <Run Text="{Binding Index, StringFormat={}{0} :}"/> <Run Text="{Binding Value, StringFormat={}{0:F4}}"/> </TextBlock> </DataTemplate> </ComboBox.ItemTemplate> <!-- 选中后的显示模板 --> <ComboBox.SelectionBoxItemTemplate> <DataTemplate> <TextBlock> <Run Text="{Binding Index, StringFormat={}{0} :}"/> <Run Text="{Binding Value, StringFormat={}{0:F4}}"/> </TextBlock> </DataTemplate> </ComboBox.SelectionBoxItemTemplate> </ComboBox>
方法二:复用索引到选中模板(仅适用于数据源固定场景)
如果不想修改数据源,可以通过自定义SelectionBoxItemTemplate,绑定控件的SelectedIndex来实现:
<ComboBox ItemsSource="{Binding DoubleList}" AlternationCount="{x:Static system:Int32.MaxValue}" x:Name="TargetComboBox"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock> <Run Text="{Binding (ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ComboBoxItem}, StringFormat={}{0} :}"/> <Run Text="{Binding ., StringFormat={}{0:F4}}"/> </TextBlock> </DataTemplate> </ComboBox.ItemTemplate> <!-- 自定义选中后的显示模板 --> <ComboBox.SelectionBoxItemTemplate> <DataTemplate> <TextBlock> <Run Text="{Binding ElementName=TargetComboBox, Path=SelectedIndex, StringFormat={}{0} :}"/> <Run Text="{Binding ., StringFormat={}{0:F4}}"/> </TextBlock> </DataTemplate> </ComboBox.SelectionBoxItemTemplate> </ComboBox>
注意:这种方法完全依赖SelectedIndex,如果数据源有排序、增减等变动,索引会出现偏差,只适合数据源固定的场景。
内容的提问来源于stack exchange,提问作者test
相关产品推荐
相关产品推荐

