== DataTemplate ==
Code behind to get a reference to object owning btnDelete:
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
var post = ((Button)sender).DataContext as Post;
if (post == null)
{
throw new InvalidOperationException("Invalid DataContext");
}
Console.WriteLine(post.author);
}
== How to: Find DataTemplate-Generated Elements ==
To find elements generated by a DataTemplate:
...
We have to find the ContentPresenter first:
// Getting the currently selected ListBoxItem
// Note that the ListBox must have
// IsSynchronizedWithCurrentItem set to True for this to work
ListBoxItem myListBoxItem =
(ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));
// Getting the ContentPresenter of myListBoxItem
ContentPresenter myContentPresenter = FindVisualChild(myListBoxItem);
// Finding textBlock from the DataTemplate that is set on that ContentPresenter
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);
// Do something to the DataTemplate-generated TextBlock
MessageBox.Show("The text of the TextBlock of the selected list item: "
+ myTextBlock.Text);
. . .
private childItem FindVisualChild(DependencyObject obj)
where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
Source: [[http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.findname.aspx|MSDN: FrameworkTemplate.FindName Method]]
=== Example 1 ===
For a ListBoxItem:
ListBoxItem lbi = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromIndex(IndexInListBox);
ComboBox cb = (ComboBox)listBox.ItemTemplate.FindName("IconComboBox", lbi);
=== Example 2 ===
For a ListBoxItem:
. . .
// To get GreekGod object
GreekGod greekGod = (GreekGod)(listBox.Items[0]);
// To get ListBoxItem container holding object GreekGod
ListBoxItem lbi1 = (ListBoxItem)(listBox.ItemContainerGenerator.ContainerFromIndex(0));
ListBoxItem lbi2 = (ListBoxItem)(listBox.ItemContainerGenerator.ContainerFromItem(listBox.Items.CurrentItem));
Source: [[http://www.zagstudio.com/blog/7#.UMESToM72dI|ZAG Log: How to get a ListBoxItem from a data bound ListBox]]