Как я могу получить элемент, выбранный в WPF-дереве? Я хочу сделать это в XAML, потому что я хочу связать это.
Вы можете подумать, что это так, SelectedItem
но, видимо, не существует он доступен только для чтения и поэтому непригоден для использования.
Вот что я хочу сделать:
<TreeView ItemsSource="{Binding Path=Model.Clusters}"
ItemTemplate="{StaticResource ClusterTemplate}"
SelectedItem="{Binding Path=Model.SelectedCluster}" />
Я хочу связать SelectedItem
к свойству на моей модели.
Но это дает мне ошибку:
Свойство SelectedItem доступно только для чтения и не может быть установлено из разметки.
Редактировать: Хорошо, это способ, которым я решил это:
<TreeView
ItemsSource="{Binding Path=Model.Clusters}"
ItemTemplate="{StaticResource HoofdCLusterTemplate}"
SelectedItemChanged="TreeView_OnSelectedItemChanged" />
и в codebehindfile моего xaml:
private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
Model.SelectedCluster = (Cluster)e.NewValue;
}
Ответы:
Я понимаю, что этот ответ уже принят, но я собрал его вместе, чтобы решить проблему. Он использует идею, аналогичную решению Delta, но без необходимости создавать подкласс TreeView:
Затем вы можете использовать это в своем XAML как:
Надеюсь, это кому-нибудь поможет!
источник
{Binding SelectedItem, Mode=TwoWay}
на{Binding MyViewModelField, Mode=TwoWay}
xmlns:e="http://schemas.microsoft.com/expression/2010/interactivity"
Это свойство существует: TreeView.SelectedItem
Но это только для чтения, поэтому вы не можете назначить его через привязку, только получить его
источник
TreeView.SelectedItem
повлиять на свойство модели, когда пользователь выбирает элемент (иначеOneWayToSource
)?Ответьте с прикрепленными свойствами и без внешних зависимостей, если необходимость когда-либо возникнет!
Вы можете создать присоединяемое свойство, которое является привязываемым и имеет геттер и сеттер:
Добавьте объявление пространства имен, содержащее этот класс, в ваш XAML и выполните привязку следующим образом (local - это то, как я назвал объявление пространства имен):
Теперь вы можете связать выбранный элемент, а также настроить его в модели представления, чтобы изменить его программно, если это когда-либо возникнет. Это, конечно, при условии, что вы реализуете INotifyPropertyChanged для этого конкретного свойства.
источник
Ну, я нашел решение. Он перемещает беспорядок, так что MVVM работает.
Сначала добавьте этот класс:
и добавьте это в свой xaml:
источник
Он отвечает немного больше, чем ожидает OP ... Но я надеюсь, что он может помочь кому-то, по крайней мере.
Если вы хотите выполнить
ICommand
всякий раз, когдаSelectedItem
изменяется, вы можете привязать команду к событию, и использование свойстваSelectedItem
вViewModel
больше не требуется.Для этого:
1- Добавить ссылку на
System.Windows.Interactivity
2- Привязать команду к событию
SelectedItemChanged
источник
System.Windows.Interactivity
может быть установлена из NuGet: nuget.org/packages/System.Windows.Interactivity.WPFSystem.Windows.Interactivity
. Это сработало для меня (пробовал с проектом .NET Core). Чтобы все это настроить, просто добавьте пакет nuget Microsoft.Xaml.Behaviors.Wpf и измените пространство имен наxmlns:i="http://schemas.microsoft.com/xaml/behaviors"
. Чтобы получить больше информации - смотрите блогЭто может быть выполнено «более приятным» способом, используя только привязку и EventToCommand библиотеки GalaSoft MVVM Light. В вашей виртуальной машине добавьте команду, которая будет вызываться при изменении выбранного элемента, и инициализируйте команду для выполнения любых необходимых действий. В этом примере я использовал RelayCommand и просто установлю свойство SelectedCluster.
Затем добавьте поведение EventToCommand в ваш xaml. Это действительно легко, используя смесь.
источник
Все к сложному ... Перейти с Caliburn Micro (http://caliburnmicro.codeplex.com/)
Посмотреть:
ViewModel:
источник
Я наткнулся на эту страницу в поисках того же ответа, что и первоначальный автор, и доказав, что всегда есть более чем один способ сделать это, решение для меня было даже проще, чем ответы, представленные здесь до сих пор, поэтому я подумал, что мог бы также добавить в кучу.
Мотивация для привязки состоит в том, чтобы держать это хорошим & MVVM. Вероятное использование ViewModel состоит в том, чтобы иметь свойство с именем, таким как «CurrentThingy», и где-то еще, DataContext для некоторой другой вещи привязан к «CurrentThingy».
Вместо того, чтобы выполнять дополнительные необходимые шаги (например, настраиваемое поведение, сторонний контроль) для поддержки приятного связывания TreeView с моей моделью, а затем с чего-то другого с моей моделью, мое решение заключалось в использовании простого Element, связывающего другую вещь с TreeView.SelectedItem, вместо того, чтобы связывать другую вещь с моей ViewModel, тем самым пропуская дополнительную работу, необходимую.
XAML:
Конечно, это отлично подходит для чтения выбранного в данный момент элемента, но не для его настройки, и это все, что мне нужно.
источник
Вы также можете использовать свойство TreeViewItem.IsSelected
источник
Существует также способ создания привязываемого свойства XAML SelectedItem без использования Interaction.Behaviors.
Затем вы можете использовать это в своем XAML как:
источник
Я перепробовал все решения этих вопросов. Никто не решил мою проблему полностью. Поэтому я думаю, что лучше использовать такой унаследованный класс с переопределенным свойством SelectedItem. Это будет отлично работать, если вы выберете элемент дерева из GUI и если вы установите это значение свойства в своем коде
источник
Моим требованием было решение на основе PRISM-MVVM, где требовалось TreeView, а связанный объект имеет тип Collection <> и, следовательно, нуждается в HierarchicalDataTemplate. BindableSelectedItemBehavior по умолчанию не сможет идентифицировать дочерний TreeViewItem. Чтобы это работало в этом сценарии.
Это позволяет перебирать все элементы независимо от уровня.
источник
Я предлагаю дополнение к поведению, предоставленному Стивом Грейтрексом. Его поведение не отражает изменений из источника, потому что это не может быть коллекция TreeViewItems. Таким образом, нужно найти TreeViewItem в дереве, для которого datacontext является выбранным значением из источника. TreeView имеет защищенное свойство с именем ItemsHost, которое содержит коллекцию TreeViewItem. Мы можем пройти через отражение и пройтись по дереву в поисках выбранного элемента.
Таким образом, поведение работает для двусторонних привязок. В качестве альтернативы, можно переместить получение ItemsHost в метод OnAttached поведения, сохраняя издержки на использование отражения каждый раз, когда привязка обновляется.
источник
WPF MVVM TreeView SelectedItem
... является лучшим ответом, но не упоминает способ получить / установить SelectedItem во ViewModel.
источник
После изучения Интернета в течение дня я нашел свое собственное решение для выбора элемента после создания нормального дерева в обычной среде WPF / C #
источник
Это также можно сделать с помощью свойства IsSelected элемента TreeView. Вот как мне это удалось,
Затем в ViewModel, которая содержит данные, к которым привязан TreeView, просто подпишитесь на событие в классе TreeViewItem.
И, наконец, реализовать этот обработчик в той же ViewModel,
И обязательна, конечно,
источник
Я знаю, что этой теме 10 лет, но проблема все еще существует ....
Первоначальный вопрос был «извлечь» выбранный элемент. Мне также нужно было «получить» выбранный элемент в моей модели просмотра (не установить его). Из всех ответов в этой теме ответ «Уэс» является единственным, который по-разному подходит к проблеме: если вы можете использовать «Выбранный элемент» в качестве цели для привязки данных, используйте его в качестве источника для привязки данных. Уэс сделал это с другим свойством view, я сделаю это с свойством viewmodel:
Нам нужны две вещи:
ViewModel:
Просмотр конструктора:
источник
(Давайте просто согласимся с тем, что TreeView явно обанкротился в связи с этой проблемой. Привязка к SelectedItem была бы очевидна. Вздох )
Мне нужно было решение для правильного взаимодействия со свойством IsSelected TreeViewItem, поэтому вот как я это сделал:
С этим XAML:
источник
Я предлагаю вам свое решение, которое предлагает следующие функции:
Поддерживает 2 способа привязки
Автоматически обновляет свойства TreeViewItem.IsSelected (согласно SelectedItem)
Нет TreeView подклассов
Элементы, привязанные к ViewModel, могут быть любого типа (даже нулевые)
1 / Вставьте следующий код в вашу CS:
2 / Пример использования в вашем файле XAML
источник
Я предлагаю это решение (которое я считаю самым простым и без утечек памяти), которое идеально подходит для обновления выбранного элемента ViewModel из выбранного элемента View.
Обратите внимание, что изменение выбранного элемента из ViewModel не будет обновлять выбранный элемент View.
Использование XAML
источник