Edit: For efficient flattening the CompositeCollection
has been quite useful to me.
I would use a value converter for that, then your binding source can stay the same.
Edit: The converter might look something like this (untested!):
[ValueConversion(typeof(ObservableCollection<Node>), typeof(List<Node>))]
public class ObservableCollectionToListConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ObservableCollection<Node> input = (ObservableCollection<Node>)value;
int targetLevel = int.Parse(parameter as string);
List<Node> output = new List<Node>();
foreach (Node node in input)
{
List<Node> tempNodes = new List<Node>();
for (int level = 0; level < targetLevel; level++)
{
Node[] tempNodesArray = tempNodes.ToArray();
tempNodes.Clear();
foreach (Node subnode in tempNodesArray)
{
if (subnode.Children != null) tempNodes.AddRange(subnode.Children);
}
}
output.AddRange(tempNodes);
}
return output;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
You would use it like this in Xaml:
<Window.Resources>
...
<local:ObservableCollectionToListConverter x:Key="ObservableCollectionToListConverter"/>
</Window.Resources>
...
<ListView ItemsSource="{Binding MyNodes, Converter={StaticResource ObservableCollectionToListConverter}, ConverterParameter=3}">
(ConverterParameter
specifies the level)