public
static
class
TreeViewHelper
{
private
static
Dictionary<ItemContainerGenerator, AutoResetEvent> _waiters =
new
Dictionary<ItemContainerGenerator, AutoResetEvent>();
public
static
void
SelectedAndExpand(
this
RadTreeView thisTreeView,
object
toSelect)
{
// Set the selectedItem, collapse all and desactivate animations
thisTreeView.SelectedItem = toSelect;
thisTreeView.CollapseAll();
AnimationManager.IsGlobalAnimationEnabled =
false
;
// Lauch background worker to not stop the UI thread when waiting for the ItemContainerGenerator
var worker =
new
BackgroundWorker() { WorkerSupportsCancellation =
false
, WorkerReportsProgress =
false
};
worker.DoWork +=
delegate
{
thisTreeView.Dispatcher.BeginInvoke(() => ExpandToObject(thisTreeView, toSelect));
};
worker.RunWorkerAsync();
worker.RunWorkerCompleted +=
delegate
{
AnimationManager.IsGlobalAnimationEnabled =
true
;
};
}
private
static
void
CheckContainerGeneratorBuzy(
this
ItemContainerGenerator generator)
{
if
(generator !=
null
&& generator.Status != GeneratorStatus.ContainersGenerated)
{
generator.StatusChanged -= ItemContainerGeneratorChanged;
generator.StatusChanged += ItemContainerGeneratorChanged;
if
(!_waiters.ContainsKey(generator))
_waiters.Add(generator,
new
AutoResetEvent(
false
));
_waiters[generator].WaitOne();
}
}
private
static
void
ItemContainerGeneratorChanged(
object
sender, System.EventArgs e)
{
var generator = sender
as
ItemContainerGenerator;
if
(generator !=
null
&& generator.Status == GeneratorStatus.ContainersGenerated)
{
generator.StatusChanged -= ItemContainerGeneratorChanged;
_waiters[generator].Set();
}
}
private
static
bool
ExpandToObject(ItemsControl control,
object
toFind)
{
bool
retval =
false
;
for
(
int
i = 0; i < control.Items.Count; i++)
{
// Wait for the ContainersGenerated
control.ItemContainerGenerator.CheckContainerGeneratorBuzy();
// Foreach item find container
var visualItem = control.ItemContainerGenerator.ContainerFromIndex(i)
as
RadTreeViewItem;
if
(visualItem !=
null
)
{
if
(!visualItem.IsExpanded)
{
// Expand causes creation of children items
// if not ContainerFromIndex will be null
visualItem.IsExpanded =
true
;
visualItem.UpdateLayout();
}
if
(visualItem.DataContext == toFind)
{
// Verify DataContext of item
retval =
true
;
visualItem.IsExpanded =
false
;
}
if
(!retval)
{
// Recurcivity to children
if
(visualItem.Items.Count > 0)
retval = ExpandToObject(visualItem, toFind);
}
if
(!retval)
// If the branch no contain item, collapse it
visualItem.IsExpanded =
false
;
else
break
;
}
}
return
retval;
}
}
Hope this code help anyone ...