Спасибо за помощь, разобрался. Ну, в любом случае это работает, но я не совсем уверен, почему это не было раньше ... если кто-нибудь может сказать мне, что это было бы прекрасно ... Я как бы соединил элементы двух ответов выше, а затем добавил немного, чтобы сделать это работает. По какой-то причине, независимо от того, что я делаю, я не могу выбрать TVI (TreeViewElement), если его родительский объект еще не раскрыт, даже если родительский TVI сказал, что его содержимое было сгенерировано и, фактически, имеет содержимое, которое я мог бы перебрать. Таким образом, мое решение состояло в том, чтобы подождать, пока будет сгенерировано содержимое, а затем пройти через них и найти то, что я хотел. Мне действительно странно, что я не мог просто взять контейнер, учитывая его содержимое. Мех. Мой код может немного измениться, но вот он: (отлично работает)
public void listItemClickClick(object sender, RoutedEventArgs e)
{
try
{
UserFile fil = (UserFile)(sender as ListBoxItem).DataContext;
MessageBox.Show("to do: download stuff");
return;
}
catch (InvalidCastException)
{
}
try
{
dirWeWantSelected = (Directory)(sender as ListBoxItem).DataContext;
}
catch (InvalidCastException)
{
MessageBox.Show("this should never happen");
}
selectedDirectoryTreeItem.IsExpanded = true;
TreeViewItem want = null;
try
{
want = selectedDirectoryTreeItem.ItemContainerGenerator.ContainerFromItem(dirWeWantSelected) as TreeViewItem;
}
catch
{
MessageBox.Show("weird error");
}
if (want != null)
{
want.IsSelected = true;
}
else
{
selectedDirectoryTreeItem.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
}
}
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (selectedDirectoryTreeItem.ItemContainerGenerator.Status
== System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
{
selectedDirectoryTreeItem.ItemContainerGenerator.StatusChanged
-= ItemContainerGenerator_StatusChanged;
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input,
new Action(DelayedAction));
}
}
void DelayedAction()
{
selectedDirectoryTreeItem.Items.MoveCurrentToFirst();
Directory curr;
do
{
curr = (Directory)selectedDirectoryTreeItem.Items.CurrentItem;
if (curr.id == dirWeWantSelected.id)
{
curr.Selected = true;
return;
}
selectedDirectoryTreeItem.Items.MoveCurrentToNext();
}
while (selectedDirectoryTreeItem.Items.CurrentItem != null);
}