Поскольку вы используете ViewModel, чтобы сидеть между вашей фактической моделью и вашим представлением, мне интересно, проще ли просто реализовать логику IValueConverter прямо там. Вроде как:
public class ViewModel
{
public ObservableCollection Root { get; set: }
public ObservableCollection Children
{
get { /* return children items */ }
}
}
Тогда вы можете просто связать непосредственно со вторым свойством:
<control:HierarchicalDataTemplate ItemsSource="{Binding Children}">
Я думаю, что основная цель объекта ViewModel - ограничить количество «уловок» (таких как IValueConverters), которые вам нужно получить, чтобы получить необходимые данные из исходной модели. Так как у вас есть, вы можете использовать его.
Редактировать 1
... и, конечно, теперь, когда я перечитал ваш пост, я вижу, что это еще не все. Вы получаете детей за каждый предмет в своей коллекции "Root".
Как насчет реализации IValueConverter как статического экземпляра в самой вашей ViewModel?
public class ViewModel : IValueConverter
{
public static readonly IValueConverter ChildrenConverter
= new LoadChildrenValueConverter();
}
Теперь вы должны быть в состоянии сказать:
<control:HierarchicalDataTemplate
ItemsSource="{Binding Converter={x:Static local:ViewModel.ChildrenConverter}}">
Редактировать 2
Хорошо, вы используете Silverlight, поэтому {x: Static} вам недоступен.
Единственная другая опция, о которой я могу подумать, позволит вам повторно использовать один статический ресурс вместо того, чтобы объявлять два, - это реализовать IValueConverter непосредственно в вашей ViewModel. Это бесполезно, если вам нужно выполнить более одного типа преобразования, но если ваша ViewModel очень узко сфокусирована, то она может выполнить эту работу. Итак:
public class ViewModel : IValueConverter
{
// move your Convert and ConvertBack methods into here
}
Теперь вы можете сделать это:
<control:HierarchicalDataTemplate
ItemsSource="{Binding Converter={StaticResource ViewModel}}">