I have a TreeView on my page. It's bound to a collection of clients containing contracts, like:

```
public class Client
{
  public int ClientID { get; set; }
  public string Name { get; set; }
  public List<Contract> Contracts { get; set; }
}

public class Contract
{
  public int ContractID { get; set; }
  public int ClientID { get; set; }
  public string Name { get; set; }
}

```

The XAML for my TreeView is as follows:

```
<sdk:TreeView x:Name="tvClientContract" ItemsSource="{Binding ClientContracts}">
  <sdk:TreeView.ItemTemplate>
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Contracts}">
      <TextBlock Text="{Binding Path=Name}" />
    </sdk:HierarchicalDataTemplate>
  </sdk:TreeView.ItemTemplate>
</sdk:TreeView>

```

Where ClientContracts is a `List<Clients>`. The binding works fine and I have a hierarchical grid.

The issue that I'm having is when opening the form with the TreeView on it I want to select the current Client, I currently use the following code:

```
TreeViewItem client = (TreeViewItem)tvClientContract.ItemContainerGenerator.ContainerFromItem(aClient);

```

or 

```
TreeViewItem client = (TreeViewItem)tvClientContract.ItemContainerGenerator.ContainerFromIndex(tvClientContract.Items.IndexOf(aClient));
client.IsSelected = true;

```

but this returns inconsistent results, for example I open the form when client 'ABC' is selected and client will be null. I open it again when client 'ABC' is selected and it returns the correct TreeViewItem. Has anyone came across this before or know anything I can look at to help solve the issue?

I run the above code within the Loaded event of the TreeView.
['https://Stackoverflow.com/questions/3363352', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/83096/']
I figured out what's happening here, the clue is in the MSDN documentation for the return value of `ItemContainerGenerator.ContainerFromItem()`:

> 
> A UIElement that corresponds to the
>  given item. Returns null if the item
>  does not belong to the item
>  collection, or if a UIElement has not
>  been generated for it.
> 
> 
> 

It looks like when null is returned, a UIElement hasn't been created for the item yet.

I got round this by using 

`tvClientContract.UpdateLayout();`

to update the layout and ensure a UIElement exists before calling

```
ItemContainerGenerator.ContainerFromItem()

```
I think that there could be some condition where "UpdateLoayout will not work":
if the TreeView is in recycling mode and the item is not in the visible portion and/or also in a "add" operation where the TreeViewItem is created on another thread.

The solution is to use similar solution as I describe in:
[WPF: Select TreeViewItem broken past the root level](https://stackoverflow.com/questions/1905995/wpf-select-treeviewitem-broken-past-the-root-level)