如何用绑定集合的索引填充组合框?
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。使用属性 Item1
和 Item2
.
引用元组组件
<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>
我想创建一个 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)
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。使用属性 Item1
和 Item2
.
<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>