2014-10-15 3 views
2

Мы используем элемент управления TreeView в MVV MVVM приложении WPF.Как вызвать фокус на TreeView из ViewModel

Я успешно добавил Развернуть/свернуть Все функции для просмотра - итерация всех элементов в TreeView, установка IsExpanded, а затем вызов Фокус на TreeView для обновления изменений.

Я также успешно добавил функциональность, чтобы очистить выбранный элемент в TreeView при щелчке пустого пространства в TreeView.

Моя текущая задача и проблема заключается в том, чтобы автоматически выбирать любые вновь добавленные элементы в TreeView. Свойства IsSelected и IsExpanded TreeViewItems привязаны к свойствам сопоставления в ViewModel, и установка IsSelected в ViewModel работает до тех пор, пока расширяется родительский узел.

Я попытался установить IsExpanded на родительский ViewModel, но насколько мне известно, мне нужно затем вызвать Focus на TreeView, чтобы заставить его обновлять и расширять свое представление дерева. Поскольку я в ViewModel, у меня нет связи с TreeView без нарушения MVVM.

Как это сделать?

Edit: Источник добавил для pushpraj

Элементы дерева сохраняются, как это:

private ObservableCollection<NodeViewModel> _children = new ObservableCollection<NodeViewModel>(); 
public ObservableCollection<NodeViewModel> Children 
{ 
    get { return _children; } 
    set 
    { 
     _children = value; 
     OnPropertyChanged("Children", this); 
    } 
} 

Дети свойство нашего корневого узла связано со свойством ItemsSource в TreeView. Дочерние узлы программно добавляются в свойство «Дети» корневого узла и друг друга.

Источник, с которым я работаю, не является моим собственным, и я не слишком опытен с WPF, поэтому, пожалуйста, простите меня, если я дам вам неправильную информацию. Я также заметил, что мы используем некоторые функции Drag/Drop в нашем TreeView от Gong Solutions. Может ли это быть причиной нашей проблемы? Установка IsExpanded в true в нашей ViewModel не расширяет запись в древовидном представлении.

+0

Вы надеваете Не нужно фокусировать ни «TreeView», ни родительский «TreeViewItem», чтобы заставить «TreeView» обновляться. Если 'TreeViewItem.IsExpanded' привязан к соответствующему свойству модели представления, просто установите для этого свойства значение' true' и добавьте новый элемент в коллекцию модели родительского представления. Если эта коллекция реализует 'INotifyCollectionChanged' (например,' ObservableCollection 'does), вы увидите новый элемент в' TreeView'. – Dennis

+0

@Dennis 'IsExpanded' привязан к соответствующему свойству, я устанавливаю его в' true' перед добавлением нового элемента, а коллекция является 'ObservableCollection', но родительский элемент не расширяется. –

ответ

2

добавить следующий стиль в ресурсах

<Style TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="FocusManager.FocusedElement" 
      Value="{Binding RelativeSource={RelativeSource Self}}" /> 
</Style> 

это позволит каждому новому TreeViewItem сосредоточиться себя при создании

попробовать и посмотреть, если это то, что вы ищете

+0

Я попробовал добавить стиль, который вы предлагаете, но родительский элемент TreeViewItem не расширяется в «TreeView», когда новый ребенок добавляется к нему и устанавливается как выбранный элемент. Я что-то неправильно понял? Я попытался добавить «Setter» к стилям ресурсов окна, а стиль «TreeView.ItemContainerStyle» –

+0

@MickWaites, описанный выше, помогает сосредоточиться только на новом добавленном элементе. Чтобы расширить родительский элемент, вы можете просто установить IsExpanded в true для родительского элемента путем привязки.Если бы вы могли поделиться каким-то кодом, как вы храните элементы дерева и заполняете древовидную структуру, возможно, я попытаюсь сделать то же самое. – pushpraj

+0

Я добавил информацию к исходному вопросу. Помогает ли это? –

Смежные вопросы