查找嵌套在ListBox.Item中的ItemsControl中的Item索引

时间:2014-02-21 10:50:30

标签: c# wpf xaml itemscontrol

我在ItemsControl内嵌套ListBox.ItemTemplate。顶部ListBoxObservableCollection数据绑定。该集合本质上是一个购买,其中包含公式,而公式又包含单个产品。

现在,如果单击公式中的单个产品,我希望将其从公式中删除。因此,在事件处理程序中,我应该能够使用以下方法确定产品的位置:

var index = [theItemsControl].ItemContainerGenerator.IndexFromContainer((sender as Button).TemplatedParent);

但是,在我的事件处理程序中,我不知道如何查找包含ItemsControl的内容。我不能给它一个固定的名字,因为它本身是ListBox.ItemTemplate的一部分,这意味着会有多个实例。

这是我的XAML,删除了任何与风格相关的内容:

<ListBox x:Name="lbBasketFormulae" ItemsSource="{Binding Path=Purchase.Formulae}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Vertical">

        <!-- Formula Title -->
        <StackPanel Orientation="Horizontal">
          <Label Width="30" Content="{Binding Path=Quantity}"></Label>
          <Label Content="{Binding Path=FormulaType, Converter={StaticResource formulaTypeToNameConverter}}"></Label>
        </StackPanel>

        <!-- Formula Products -->
        <ItemsControl ItemsSource="{Binding Path=Products}">
          <ItemsControl.ItemTemplate>
            <DataTemplate>
              <Button x:Name="bnBasketFormulaProduct" HorizontalContentAlignment="Left" Content="{Binding Path=Name}" Click="bnBasketFormulaProduct_Click">
                <Button.Template>
                  <ControlTemplate TargetType="Button">
                    <TextBlock Text="{TemplateBinding Content}" />
                  </ControlTemplate>
                </Button.Template>
              </Button>
            </DataTemplate>
          </ItemsControl.ItemTemplate>
        </ItemsControl>

      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

所以,我的问题是:如何在购买时在我的配方中找到我的产品的位置以及该配方的位置,以便我可以将其从ObservableCollection中删除? (然后更改集合应该自动反映到UI,因为它是数据绑定的。)

非常感谢任何建议或提示!

此致

克里斯

2 个答案:

答案 0 :(得分:0)

答案是使用ItemContainerGenerator.IndexFromContainer找不到任何位置。您的问题显然发生在ViewModel中,因此您应该在ViewModel中寻找所选项目或其他内容,而不是ListBox或Window后面的代码。

因此,我建议您使用正确的Bindings创建一个合适的ViewModel。

答案 1 :(得分:0)

你应该可以通过viewmodel来做到这一点。但如果你想要,你可以使用:

VisualTreeHelper.GetParent(myUserControl);