2014-02-21 2 views
1

У меня есть ItemsControl, вложенный внутри ListBox.ItemTemplate. Верх ListBox привязан к данным на ObservableCollection. Коллекция - это Покупка, содержащая формулы, которые, в свою очередь, содержат отдельные продукты.Найти указатель элемента в ItemsControl, вложенный внутри LixtBox.Item

Теперь, если щелкнут индивидуальный продукт внутри формулы, я хотел бы, чтобы он был удален из его формулы. Таким образом, в обработчик событий, я должен быть в состоянии определить позицию продукта с помощью:

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? (Изменение коллекции затем автоматически отражается на пользовательском интерфейсе, поскольку оно привязано к данным.)

Большое спасибо за любые советы или подсказки!

С уважением,

Chris

ответ

0

Это правда, что вы должны быть в состоянии сделать это через viewmodel. Но если вы хотите, вы можете использовать:

VisualTreeHelper.GetParent(myUserControl); 
+0

Спасибо. Используя этот метод, я смог получить доступ к файлу данных родителя, который в конечном итоге стал еще более полезным и надежным, чем просто индекс, который я хотел в первую очередь. – Christophe

0

Ответ Вы не нашли ни одной позиции чего-либо с помощью ItemContainerGenerator.IndexFromContainer. Ваша проблема явно происходит внутри ViewModel, и поэтому вы должны искать выбранный элемент или что-то еще внутри вашей ViewModel, а не в ListBox или в коде Window.

Поэтому я предлагаю вам создать надлежащую ViewModel с соответствующими привязками.

+0

Спасибо, но в настоящее время я не реализую шаблон MVVM. Я новичок в WPF/XAML, и это достаточно сложно, как есть. – Christophe

+0

Я понимаю, что вы хотите, чтобы все было просто. Я иногда чувствую, как пробивает парня, который убедил нас переехать в WPF, потому что простые вещи могут занять гораздо больше времени. Но будьте осторожны, ваша логика не привязана к вашим элементам управления, поскольку это приводит к тому, что LOT больше работает. Обнаружение ошибок WPF не очень приятно. Пожалуйста, ознакомьтесь с этой веткой для некоторых замечательных советов, которые действительно помогли мне: http://stackoverflow.com/questions/8863840/developing-wpf-software-without-mvvm – David

Смежные вопросы