C# 通过绑定访问当前ItemsControl索引
我有下面的代码C# 通过绑定访问当前ItemsControl索引,c#,wpf,data-binding,itemscontrol,stackpanel,C#,Wpf,Data Binding,Itemscontrol,Stackpanel,我有下面的代码 <ItemsControl x:Name="ItemsControl" ItemsSource="{Binding Offers}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Vertical"></St
<ItemsControl x:Name="ItemsControl" ItemsSource="{Binding Offers}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<wpf:Card Padding="32" Margin="5" d:DataContext="{d:DesignData }">
<StackPanel Margin="0,0,0,-30" Height="107">
<TextBlock
Style="{DynamicResource MaterialDesignTitleTextBlock}">
<Run Text="Offer " />
</TextBlock>
<TextBlock Text="{Binding CarDescription}" />
<Separator Height="1" Visibility="Hidden" />
<Button Content="Select"
Width="72"
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Margin="0,20,0,0"
Command="{Binding SelectOfferCommand}"/>
</StackPanel>
</wpf:Card>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这会产生一组重复的框,每个框都有一个按钮。每次单击按钮时,我都希望访问当前框索引(来自ItemsControl的ItemsSource)并将其作为命令参数传递。可以这样做吗?可能适合您在创建
优惠
时,为每个优惠
添加索引
属性,并在SelectOfferCommand上发送此索引。这会容易得多
ps我想我必须解释我的答案:我的建议不仅易于实现,而且将业务逻辑与UI分离也是一个很好的实践。在这种情况下,如果将更改UI,更改将不会影响整个订购过程您可以使用
更改索引
传递项控件
的当前索引
例如:
<ItemsControl x:Name="ItemsControl"
ItemsSource="{Binding Offers}"
AlternationCount="1000">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<wpf:Card Padding="32" Margin="5" d:DataContext="{d:DesignData }">
<StackPanel Margin="0,0,0,-30" Height="107">
<TextBlock
Style="{DynamicResource MaterialDesignTitleTextBlock}">
<Run Text="Offer " />
</TextBlock>
<TextBlock Text="{Binding CarDescription}" />
<Separator Height="1" Visibility="Hidden" />
<Button Content="Select"
Width="72"
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Margin="0,20,0,0"
Command="{Binding SelectOfferCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}"/>
</StackPanel>
</wpf:Card>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
为什么?您可以传递itemTemplate绑定到的实际项目。不要按其类型命名可视对象。您应该将ItemsControl的名称更改为另一个名称,例如:“ItemsControl提供”。@UçanKartal的原因是什么?“ItemsControl”在这里是一个非常有效的名称。@克莱门斯,因为当你有很多窗口时,它会帮助你区分实体。@UçanKartal这没有意义。这里当然只有一个窗口。不要这样做,看。