我在ItemsControl
内嵌套ListBox.ItemTemplate
。顶部ListBox
与ObservableCollection
数据绑定。该集合本质上是一个购买,其中包含公式,而公式又包含单个产品。
现在,如果单击公式中的单个产品,我希望将其从公式中删除。因此,在事件处理程序中,我应该能够使用以下方法确定产品的位置:
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,因为它是数据绑定的。)
非常感谢任何建议或提示!
此致
克里斯
答案 0 :(得分:0)
答案是使用ItemContainerGenerator.IndexFromContainer找不到任何位置。您的问题显然发生在ViewModel中,因此您应该在ViewModel中寻找所选项目或其他内容,而不是ListBox或Window后面的代码。
因此,我建议您使用正确的Bindings创建一个合适的ViewModel。
答案 1 :(得分:0)
你应该可以通过viewmodel来做到这一点。但如果你想要,你可以使用:
VisualTreeHelper.GetParent(myUserControl);