如何用绑定集合的索引填充组合框?

How to fill a ComboBox with indexes of bound collection?

我想创建一个 ComboBox,其中 TextBlock 的内容来自“Sample 01”,其中数字替换为项目的索引(来自 1)。

下面是我目前的大致代码:

<ComboBox
    x:Name="ComboSampleItems"
    Grid.Column="0"
    Height="20"
    HorizontalAlignment="Stretch"
    ItemsSource="{Binding ReportModel.SampleData}"
    SelectedItem="{Binding SelectedSampleScans}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ????, StringFormat=Something here?}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

我正在使用 INPC 来确保 VM 上的更改反映视图,因为我正在使用 MVVM。 我怎样才能达到我想要的结果?我考虑过转换器,但不确定它是否适合我想做的事情,或者是否有更好的方法。

这与 this topic?

有关系吗

集合不为其项目提供明确索引。换句话说,虽然例如a List<string> 包含字符串并且它们都可以被索引,没有 属性 用于单个项目的索引。您可以做的只是公开一个 (Index, Item) 元组的集合。注意,我在这里使用 Tuple<string, int>,因为值元组像 (string, int) . You could also construct a custom type or use KeyValuePair<string, int> 代替。

public List<Tuple<string, int>> IndexedSampleData { get; }

您可以使用 LINQ 及其 Select 方法对其进行初始化。根据您的具体情况,您也可以为此目的使用 IEnumerable<(string, int)>ObservableCollection<(string, int)>

IndexedSampleData = SampleData.Select((item, index) => new Tuple<string, int>(item, index)).ToList();

在 XAML 中你可以使用 MultiBinding in combination with StringFormat, see Standard numeric format strings。使用属性 Item1Item2.

引用元组组件
<ComboBox
   x:Name="ComboSampleItems"
   Grid.Column="0"
   Height="20"
   HorizontalAlignment="Stretch"
   ItemsSource="{Binding IndexedSampleData}">
   <ComboBox.ItemTemplate>
      <DataTemplate>
         <TextBlock>
            <TextBlock.Text>
               <MultiBinding StringFormat="{}{0} {1:D2}">
                  <Binding Path="Item1"/>
                  <Binding Path="Item2"/>
               </MultiBinding>
            </TextBlock.Text>
         </TextBlock>
      </DataTemplate>
   </ComboBox.ItemTemplate>
</ComboBox>