WPF Treeview'da SelectedItem ilə əlaqəli məlumatlar

WPF-treeview-da seçilən elementi necə əldə etmək olar? Bunu XAML-də etmək istəyirəm, çünki onu bağlamaq istəyirəm.

Bunun SelectedItem olduğunu düşünə bilərsən, ancaq qeyri-mövcud olan oxunan və buna görə yararsızdır.

Bunu etmək istəyirəm:

 <TreeView ItemsSource="{Binding Path=Model.Clusters}" ItemTemplate="{StaticResource ClusterTemplate}" SelectedItem="{Binding Path=Model.SelectedCluster}" /> 

SelectedItem bir əmlaka bağlamaq istəyirəm.

Ancaq mənə bir səhv verir:

SelectedItem mülkiyyəti yalnız oxunur və düzəlişdən təyin edilə bilməz.

Düzəliş edin: Tamam, buna görə qərar verdim:

 <TreeView ItemsSource="{Binding Path=Model.Clusters}" ItemTemplate="{StaticResource HoofdCLusterTemplate}" SelectedItemChanged="TreeView_OnSelectedItemChanged" /> 

və xaml'm kodbehind faylında:

 private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { Model.SelectedCluster = (Cluster)e.NewValue; } 
209
16 июня '09 в 10:41 2009-06-16 10:41 Natrium 16 iyun '09 saat 10:41 'da təyin olunur 2009-06-16 10:41
@ 1 cavab

Mən başa düşürəm ki, bu, artıq cavabını qəbul edib, amma problemi həll etmək üçün bir araya qoyuram. Delta'yı həll etmək üçün bir fikirdir, lakin TreeView alt sinifinə ehtiyac olmadan:

 public class BindableSelectedItemBehavior : Behavior<TreeView> { #region SelectedItem Property public object SelectedItem { get { return (object)GetValue(SelectedItemProperty); } set { SetValue(SelectedItemProperty, value); } } public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null, OnSelectedItemChanged)); private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var item = e.NewValue as TreeViewItem; if (item != null) { item.SetValue(TreeViewItem.IsSelectedProperty, true); } } #endregion protected override void OnAttached() { base.OnAttached(); this.AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged; } protected override void OnDetaching() { base.OnDetaching(); if (this.AssociatedObject != null) { this.AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged; } } private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { this.SelectedItem = e.NewValue; } } 

Sonra XAML-da belə istifadə edə bilərsiniz:

 <TreeView> <e:Interaction.Behaviors> <behaviours:BindableSelectedItemBehavior SelectedItem="{Binding SelectedItem, Mode=TwoWay}" /> </e:Interaction.Behaviors> </TreeView> 

Bu birinə kömək edir!

206
25 февр. Cavab Steve Greatrex tərəfindən Fevral 25 2011-02-25 17:29 '11 at 17:29 2011-02-25 17:29

Bu xüsusiyyət mövcuddur: TreeView.SelectedItem

border=0

Ancaq oxumaq yalnız, belə ki, onu bir bağlama vasitəsi ilə təyin edə bilməzsiniz, ancaq onu ala bilərsiniz

43
16 июня '09 в 11:04 2009-06-16 11:04 Tomas Leveskaya 16 İyun '09 'da 11:04' da cavab verin 2009-06-16 11:04

Bəli, bir həll tapdım. Qarışıqlıq hərəkət edir, beləliklə MVVM işləyir.

Əvvəlcə bu sinifə əlavə edin:

 public class ExtendedTreeView : TreeView { public ExtendedTreeView() : base() { this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(___ICH); } void ___ICH(object sender, RoutedPropertyChangedEventArgs<object> e) { if (SelectedItem != null) { SetValue(SelectedItem_Property, SelectedItem); } } public object SelectedItem_ { get { return (object)GetValue(SelectedItem_Property); } set { SetValue(SelectedItem_Property, value); } } public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null)); } 

və xaml əlavə edin:

  <local:ExtendedTreeView ItemsSource="{Binding Items}" SelectedItem_="{Binding Item, Mode=TwoWay}"> ..... </local:ExtendedTreeView> 
38
21 авг. cavab verildi Delta 21 Avqust 2010-08-21 00:43 '10 at 0:43 2010-08-21 00:43

Lazım olduqda əlavə xüsusiyyətlərə və xarici əlaqələrə cavab verin!

Bağlı ola bilən əlavə xüsusiyyət yaratmaq və alıcı və setter ola bilərsiniz:

 public class TreeViewHelper { private static Dictionary<DependencyObject, TreeViewSelectedItemBehavior> behaviors = new Dictionary<DependencyObject, TreeViewSelectedItemBehavior>(); public static object GetSelectedItem(DependencyObject obj) { return (object)obj.GetValue(SelectedItemProperty); } public static void SetSelectedItem(DependencyObject obj, object value) { obj.SetValue(SelectedItemProperty, value); } // Using a DependencyProperty as the backing store for SelectedItem. This enables animation, styling, binding, etc... public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(TreeViewHelper), new UIPropertyMetadata(null, SelectedItemChanged)); private static void SelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { if (!(obj is TreeView)) return; if (!behaviors.ContainsKey(obj)) behaviors.Add(obj, new TreeViewSelectedItemBehavior(obj as TreeView)); TreeViewSelectedItemBehavior view = behaviors[obj]; view.ChangeSelectedItem(e.NewValue); } private class TreeViewSelectedItemBehavior { TreeView view; public TreeViewSelectedItemBehavior(TreeView view) { this.view = view; view.SelectedItemChanged += (sender, e) => SetSelectedItem(view, e.NewValue); } internal void ChangeSelectedItem(object p) { TreeViewItem item = (TreeViewItem)view.ItemContainerGenerator.ContainerFromItem(p); item.IsSelected = true; } } } 

XAML-a bu klassı ehtiva edən bir ad boşluğu bəyanatını əlavə edin və aşağıdakı kimi bağlayın (ad verdiyim ad elan bəyannaməsi deyilir):

  <TreeView ItemsSource="{Binding Path=Root.Children}" local:TreeViewHelper.SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}"> </TreeView> 

İndi seçilmiş maddəni əlavə edə bilərsiniz və həmçinin bu tələbin yaranması halında onu proqramlı şəkildə dəyişdirmək üçün onu görüntüləmə modelinizə yerləşdirə bilərsiniz. Bu, əlbəttə ki, bu xüsusiyyətdə INotifyPropertyChanged tətbiq etdiyini göstərir.

33
23 авг. Cavab 23 oktyabrda verilir . 2011-08-23 01:23 '11 də 1:23 'da 2011-08-23 01:23

O, OP-dan bir az daha çox cavab verir ... Amma ümid edirəm ki, bu, ən azı birinə kömək edə bilər.

SelectedItem dəyişdikdə ICommand yerinə yetirmək istəyirsinizsə, əmrləri hadisə ilə əlaqələndirə bilərsiniz və ViewModel SelectedItem xüsusiyyətindən istifadə etmək artıq tələb olunur.

Bunun üçün:

1- System.Windows.Interactivity a keçid əlavə edin

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

2- əmrini SelectedItemChanged hadisəsinə bağlayın

 <TreeView x:Name="myTreeView" Margin="1" ItemsSource="{Binding Directories}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectedItemChanged"> <i:InvokeCommandAction Command="{Binding SomeCommand}" CommandParameter=" {Binding ElementName=myTreeView ,Path=SelectedItem}"/> </i:EventTrigger> </i:Interaction.Triggers> <TreeView.ItemTemplate> <!-- ... --> </TreeView.ItemTemplate> </TreeView> 
19
09 марта '16 в 12:57 2016-03-09 12:57 Cavab JiBéDoublevé mart 09 '16 da 12:57 2016-03-09 12:57 tərəfindən verilir

Bu, yalnız bağlanma və GalASoft MVVM Light EventToCommand kitabxanasını istifadə edərək "daha yaxşı" ola bilər. VM-də, seçilmiş maddə dəyişdirildikdə çağırılacaq bir əmr əlavə edin və əmrinizi yerinə yetirmək üçün əmrini işə salın. Bu misalda, RelayCommand istifadə və yalnız SelectedCluster xüsusiyyətini təyin etdim.

 public class ViewModel { public ViewModel() { SelectedClusterChanged = new RelayCommand<Cluster>( c => SelectedCluster = c ); } public RelayCommand<Cluster> SelectedClusterChanged { get; private set; } public Cluster SelectedCluster { get; private set; } } 

Sonra xaml üçün EventToCommand davranış əlavə edin. Qarışıq istifadə edərək çox sadədir.

 <TreeView x:Name="lstClusters" ItemsSource="{Binding Path=Model.Clusters}" ItemTemplate="{StaticResource HoofdCLusterTemplate}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectedItemChanged"> <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding SelectedClusterChanged}" CommandParameter="{Binding ElementName=lstClusters,Path=SelectedValue}"/> </i:EventTrigger> </i:Interaction.Triggers> </TreeView> 
18
04 февр. cavab bstoney verildi 04 fevral. 2011-02-04 17:15 '11 saat 17:15 'da 2011-02-04 17:15

Bütün bunlar mürəkkəbdir ... Caliburn Micro ilə gedək (http://caliburnmicro.codeplex.com/)

Görünüş:

 <TreeView Micro:Message.Attach="[Event SelectedItemChanged] = [Action SetSelectedItem($this.SelectedItem)]" /> 

ViewModel:

 public void SetSelectedItem(YourNodeViewModel item) {}; 
13
20 июля '11 в 23:27 2011-07-20 23:27 Cavab Devgig 20 iyul '11, saat 11:27 'də verilir 2011-07-20 23:27

Mən bu səhifəyə qaçdım, orijinal yazıçı ilə eyni cavabı axtarıram və bunu etmək üçün birdən çox yolun var olduğunu sübut etdim, mənim üçün həll bu günə qədər verilən cavablardan daha sadə idi, buna görə qərar verdim Mən yığmaya da əlavə edə bilərəm.

Məqsəd motivasiya - onu və MVVM-ni saxlaya bilərsiniz. ViewModel-in istifadə edilməsi "CurrentThingy" kimi w / name xüsusiyyətinə malikdir və başqa yerdə başqa bir şey üçün DataContext "CurrentThingy" ilə bağlıdır.

TreeView-dan mənim modelimə və sonra başqa bir şeydən modelimə yaxşı bir şəkildə qoşulmaq üçün əlavə addımlar atmaq əvəzinə (məsələn, xüsusi davranış, üçüncü tərəf nəzarəti) əvəzinə mənim həllim başqa bir şeyi bir-birinə bağlayan sadə bir elementdən istifadə etmək idi TreeView.SelectedItem, başqa bir şeyi mənim ViewModel ilə əlaqələndirmək yerinə, əlavə işi atlayaraq.

XAML:

 <TreeView x:Name="myTreeView" ItemsSource="{Binding MyThingyCollection}"> .... stuff </TreeView> <!-- then.. somewhere else where I want to see the currently selected TreeView item: --> <local:MyThingyDetailsView DataContext="{Binding ElementName=myTreeView, Path=SelectedItem}" /> 

Əlbəttə ki, bu, seçilmiş məqaləni oxumaq üçün yaxşıdır, lakin qurmaq üçün deyil, bütün ehtiyacım var.

8
13 июня '11 в 7:48 2011-06-13 07:48 Wes 13 iyun 2011-ci il tarixində saat 07: 48-da cavab verilir

Ayrıca TreeViewItem.IsSelected özelliğini istifadə edə bilərsiniz

5
10 авг. cavab nabeelfarid 10 aug verilir . 2010-08-10 12:36 '10 at 12:36 PM 2010-08-10 12:36

Bu məsələlərə dair bütün həlləri sınamışam. Heç kimse problemimi tamamilə həll etmədi. Buna görə də inanıram ki, belə bir devralınan sinfi keçmiş SelectedItem mülkiyyəti ilə istifadə etmək daha yaxşıdır. GUI-dən bir ağac maddə seçsəniz və bu əmlak dəyərini kodunuza qoyursanız yaxşı işləyəcək.

 public class TreeViewEx : TreeView { public TreeViewEx() { this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(TreeViewEx_SelectedItemChanged); } void TreeViewEx_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { this.SelectedItem = e.NewValue; } #region SelectedItem /// <summary> /// Gets or Sets the SelectedItem possible Value of the TreeViewItem object. /// </summary> public new object SelectedItem { get { return this.GetValue(TreeViewEx.SelectedItemProperty); } set { this.SetValue(TreeViewEx.SelectedItemProperty, value); } } // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... public new static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(TreeViewEx), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, SelectedItemProperty_Changed)); static void SelectedItemProperty_Changed(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { TreeViewEx targetObject = dependencyObject as TreeViewEx; if (targetObject != null) { TreeViewItem tvi = targetObject.FindItemNode(targetObject.SelectedItem) as TreeViewItem; if (tvi != null) tvi.IsSelected = true; } } #endregion SelectedItem public TreeViewItem FindItemNode(object item) { TreeViewItem node = null; foreach (object data in this.Items) { node = this.ItemContainerGenerator.ContainerFromItem(data) as TreeViewItem; if (node != null) { if (data == item) break; node = FindItemNodeInChildren(node, item); if (node != null) break; } } return node; } protected TreeViewItem FindItemNodeInChildren(TreeViewItem parent, object item) { TreeViewItem node = null; bool isExpanded = parent.IsExpanded; if (!isExpanded) //Can't find child container unless the parent node is Expanded once { parent.IsExpanded = true; parent.UpdateLayout(); } foreach (object data in parent.Items) { node = parent.ItemContainerGenerator.ContainerFromItem(data) as TreeViewItem; if (data == item  node != null) break; node = FindItemNodeInChildren(node, item); if (node != null) break; } if (node == null  parent.IsExpanded != isExpanded) parent.IsExpanded = isExpanded; if (node != null) parent.IsExpanded = true; return node; } } 
3
16 авг. Evgeny Bechkalo'nun cavabı 16 Avqust . 2013-08-16 06:59 '13 'da 6:59' da 2013-08-16 06:59

Interaction.Behaviors istifadə etmədən SelectedItem XAML bağlanma xüsusiyyətləri yaratmaq üçün bir yol da var.

 public static class BindableSelectedItemHelper { #region Properties public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.RegisterAttached("SelectedItem", typeof(object), typeof(BindableSelectedItemHelper), new FrameworkPropertyMetadata(null, OnSelectedItemPropertyChanged)); public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(BindableSelectedItemHelper), new PropertyMetadata(false, Attach)); private static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(BindableSelectedItemHelper)); #endregion #region Implementation public static void SetAttach(DependencyObject dp, bool value) { dp.SetValue(AttachProperty, value); } public static bool GetAttach(DependencyObject dp) { return (bool)dp.GetValue(AttachProperty); } public static string GetSelectedItem(DependencyObject dp) { return (string)dp.GetValue(SelectedItemProperty); } public static void SetSelectedItem(DependencyObject dp, object value) { dp.SetValue(SelectedItemProperty, value); } private static bool GetIsUpdating(DependencyObject dp) { return (bool)dp.GetValue(IsUpdatingProperty); } private static void SetIsUpdating(DependencyObject dp, bool value) { dp.SetValue(IsUpdatingProperty, value); } private static void Attach(DependencyObject sender, DependencyPropertyChangedEventArgs e) { TreeListView treeListView = sender as TreeListView; if (treeListView != null) { if ((bool)e.OldValue) treeListView.SelectedItemChanged -= SelectedItemChanged; if ((bool)e.NewValue) treeListView.SelectedItemChanged += SelectedItemChanged; } } private static void OnSelectedItemPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { TreeListView treeListView = sender as TreeListView; if (treeListView != null) { treeListView.SelectedItemChanged -= SelectedItemChanged; if (!(bool)GetIsUpdating(treeListView)) { foreach (TreeViewItem item in treeListView.Items) { if (item == e.NewValue) { item.IsSelected = true; break; } else item.IsSelected = false; } } treeListView.SelectedItemChanged += SelectedItemChanged; } } private static void SelectedItemChanged(object sender, RoutedEventArgs e) { TreeListView treeListView = sender as TreeListView; if (treeListView != null) { SetIsUpdating(treeListView, true); SetSelectedItem(treeListView, treeListView.SelectedItem); SetIsUpdating(treeListView, false); } } #endregion } 

Sonra XAML-da belə istifadə edə bilərsiniz:

 <TreeView helper:BindableSelectedItemHelper.Attach="True" helper:BindableSelectedItemHelper.SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
3
30 мая '13 в 18:05 2013-05-30 18:05 Cavab Paul Solomenchuk tərəfindən verilir 30 May, 2013 at 6:05 pm 2013-05-30 18:05

Mənim ehtiyacım bir TreeView lazım olan PRISM-MVVM əsasında bir həll idi və əlaqəli obyektin növü Collection <> və buna görə də bir HierarchicalDataTemplate lazımdır. Varsayılan olaraq, BindableSelectedItemBehavior bir uşaq TreeViewItem müəyyən edə bilməyəcək. Bu ssenaridə çalışdı.

 public class BindableSelectedItemBehavior : Behavior<TreeView> { #region SelectedItem Property public object SelectedItem { get { return (object)GetValue(SelectedItemProperty); } set { SetValue(SelectedItemProperty, value); } } public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null, OnSelectedItemChanged)); private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var behavior = sender as BindableSelectedItemBehavior; if (behavior == null) return; var tree = behavior.AssociatedObject; if (tree == null) return; if (e.NewValue == null) foreach (var item in tree.Items.OfType<TreeViewItem>()) item.SetValue(TreeViewItem.IsSelectedProperty, false); var treeViewItem = e.NewValue as TreeViewItem; if (treeViewItem != null) treeViewItem.SetValue(TreeViewItem.IsSelectedProperty, true); else { var itemsHostProperty = tree.GetType().GetProperty("ItemsHost", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (itemsHostProperty == null) return; var itemsHost = itemsHostProperty.GetValue(tree, null) as Panel; if (itemsHost == null) return; foreach (var item in itemsHost.Children.OfType<TreeViewItem>()) { if (WalkTreeViewItem(item, e.NewValue)) break; } } } public static bool WalkTreeViewItem(TreeViewItem treeViewItem, object selectedValue) { if (treeViewItem.DataContext == selectedValue) { treeViewItem.SetValue(TreeViewItem.IsSelectedProperty, true); treeViewItem.Focus(); return true; } var itemsHostProperty = treeViewItem.GetType().GetProperty("ItemsHost", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (itemsHostProperty == null) return false; var itemsHost = itemsHostProperty.GetValue(treeViewItem, null) as Panel; if (itemsHost == null) return false; foreach (var item in itemsHost.Children.OfType<TreeViewItem>()) { if (WalkTreeViewItem(item, selectedValue)) break; } return false; } #endregion protected override void OnAttached() { base.OnAttached(); this.AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged; } protected override void OnDetaching() { base.OnDetaching(); if (this.AssociatedObject != null) { this.AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged; } } private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { this.SelectedItem = e.NewValue; } } 

Bu, səviyyədən asılı olmayaraq bütün maddələrin təkrarlanmasına imkan verir.

2
20 окт. Cavab 20 oktyabrda Chaitanya Kadamati tərəfindən verilir . 2015-10-20 12:39 '15 'də 12:39' də 2015-10-20 12:39

Steve Velitrek'in davranışına bir əlavə təklif edirəm. Onun davranışı qaynaqdakı dəyişiklikləri əks etdirmir, çünki bu, TreeViewItems-in toplusu ola bilməz. Beləliklə, ağacdakı TreeViewItem'yi axtarmaq məsələsidir. Datacontext mənbədən seçilən dəyərdir. TreeView, TreeViewItem toplusunu ehtiva edən qorunan ItemsHost mülkiyyətinə malikdir. Biz onu əks etdirmək və seçilmiş maddə axtarır olan ağacdan keçə bilərik.

 private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var behavior = sender as BindableSelectedItemBehaviour; if (behavior == null) return; var tree = behavior.AssociatedObject; if (tree == null) return; if (e.NewValue == null) foreach (var item in tree.Items.OfType<TreeViewItem>()) item.SetValue(TreeViewItem.IsSelectedProperty, false); var treeViewItem = e.NewValue as TreeViewItem; if (treeViewItem != null) { treeViewItem.SetValue(TreeViewItem.IsSelectedProperty, true); } else { var itemsHostProperty = tree.GetType().GetProperty("ItemsHost", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (itemsHostProperty == null) return; var itemsHost = itemsHostProperty.GetValue(tree, null) as Panel; if (itemsHost == null) return; foreach (var item in itemsHost.Children.OfType<TreeViewItem>()) if (WalkTreeViewItem(item, e.NewValue)) break; } } public static bool WalkTreeViewItem(TreeViewItem treeViewItem, object selectedValue) { if (treeViewItem.DataContext == selectedValue) { treeViewItem.SetValue(TreeViewItem.IsSelectedProperty, true); treeViewItem.Focus(); return true; } foreach (var item in treeViewItem.Items.OfType<TreeViewItem>()) if (WalkTreeViewItem(item, selectedValue)) return true; return false; } 

Beləliklə, davranış iki tərəfli bağlamalar üçün işləyir. Alternativ olaraq, ItemsHostun alınmasını OnAttached davranış metoduna köçürə bilərsiniz, məsələn, hər dəfə bağlama gündəmdə əks olunduqda yuxarıdan qənaət edin.

2
12 июля '11 в 4:38 2011-07-12 04:38 cavab 12 iyul 2011-ci il saat 4: 38- də Arthur Nunes tərəfindən verilmişdir 2011-07-12 04:38

WPF MVVM TreeView SelectedItem

... bu ən yaxşı cavabdır, lakin ViewModel-də SelectedItem-ni almaq və / əldə etmək yolunu qeyd etmir.

  • Sizin ItemViewModel üçün mantıksal bir IsSelected mülk əlavə et və TreeViewItem üçün Style Setter-ə bağlayın.
  • SelectedItem xüsusiyyətini TreeView üçün DataContext kimi istifadə olunan ViewModel-ə əlavə edin. Bu yuxarıdakı həllində itkin hissəsidir.
 'ItemVM ... İctimai Mülkiyyət Boolean olaraq seçilmişdir Getmək Qayıtmaq _func.SelectedNode Me Sona get Set (Boolean kimi dəyər) Bundan sonra İsanın seçilmiş dəyəri _func.SelectedNode = Əgər (dəyər, Me, Nothing) End əgər RaisePropertyChange () Sona çatdıq End əmlak 'TreeVM ... İctimai Mülkiyyət Seçilənİtem kimi ItemVM Getmək _SelectedItem qayıdın Sona get Set (ItemVM kimi dəyər) Sonra _selectedItem dəyərdirsə Qaytar End əgər Dim prev = _selectedItem _selectedItem = dəyər Əgər əvvəlcədən IsNot Nothing Then prev.IsSelected = Yanlış End əgər Sonra _selectedItem IsNot Heç bir şey yoxsa _selectedItem.IsSelected = Doğru End əgər Sona çatdıq End əmlak
 <TreeView ItemsSource="{Binding Path=TreeVM}" BorderBrush="Transparent"> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Setter Property="IsExpanded" Value="{Binding IsExpanded}"/> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> </Style> </TreeView.ItemContainerStyle> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}"/> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> 
2
26 мая '15 в 17:34 2015-05-26 17:34 cavab Mayın 26-da saat 17:34 'də JustinMichel tərəfindən verilmişdir 2015-05-26 17:34

Gün ərzində interneti araşdırdıqdan sonra adi WPF / C # mühitində bir ağac yaratdıqdan sonra maddə seçmək üçün özüm tapdım

 private void BuildSortTree(int sel) { MergeSort.Items.Clear(); TreeViewItem itTemp = new TreeViewItem(); itTemp.Header = SortList[0]; MergeSort.Items.Add(itTemp); TreeViewItem prev; itTemp.IsExpanded = true; if (0 == sel) itTemp.IsSelected= true; prev = itTemp; for(int i = 1; i<SortList.Count; i++) { TreeViewItem itTempNEW = new TreeViewItem(); itTempNEW.Header = SortList[i]; prev.Items.Add(itTempNEW); itTempNEW.IsExpanded = true; if (i == sel) itTempNEW.IsSelected = true; prev = itTempNEW ; } } 
1
19 апр. Cavab karma verilib 19 aprel. 2013-04-19 17:38 '13 da 5:38 pm 2013-04-19 17:38

Bu da TreeView elementinin IsSelected xüsusiyyətindən istifadə etməklə də edilə bilər. İşdə bunu necə etdim,

 public delegate void TreeviewItemSelectedHandler(TreeViewItem item); public class TreeViewItem { public static event TreeviewItemSelectedHandler OnItemSelected = delegate { }; public bool IsSelected { get { return isSelected; } set { isSelected = value; if (value) OnItemSelected(this); } } } 

Daha sonra TreeView-in verildiyi məlumatı ehtiva edən ViewModel-də sadəcə TreeViewItem sinifində olan hadisəyə abunə olun.

 TreeViewItem.OnItemSelected += TreeViewItemSelected; 

Və nəhayət, bu işəgötürəni eyni ViewModel,

 private void TreeViewItemSelected(TreeViewItem item) { //Do something } 

Əlbəttə,

 <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
1
13 февр. Cavab Fahad Owais tərəfindən fevralın 13-də verilir. 2015-02-13 19:10 '15 'da 19:10' de 2015-02-13 19:10

Aşağıdakı xüsusiyyətləri təklif edən mənim həlimimi gətirərik:

  • Bağlamaq üçün 2 yol dəstəkləyir

  • Auto yenilənir TreeViewItem.IsSelected xüsusiyyətləri (SelectedItem görə)

  • TreeView heç bir alt sinif

  • ViewModel ilə əlaqəli əşyalar hər hansı bir növü ola bilər (hətta null)

1 / Aşağıdakı kodu CS ünvanına yapışdırın:

 public class BindableSelectedItem { public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.RegisterAttached( "SelectedItem", typeof(object), typeof(BindableSelectedItem), new PropertyMetadata(default(object), OnSelectedItemPropertyChangedCallback)); private static void OnSelectedItemPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var treeView = d as TreeView; if (treeView != null) { BrowseTreeViewItems(treeView, tvi => { tvi.IsSelected = tvi.DataContext == e.NewValue; }); } else { throw new Exception("Attached property supports only TreeView"); } } public static void SetSelectedItem(DependencyObject element, object value) { element.SetValue(SelectedItemProperty, value); } public static object GetSelectedItem(DependencyObject element) { return element.GetValue(SelectedItemProperty); } public static void BrowseTreeViewItems(TreeView treeView, Action<TreeViewItem> onBrowsedTreeViewItem) { var collectionsToVisit = new System.Collections.Generic.List<Tuple<ItemContainerGenerator, ItemCollection>> { new Tuple<ItemContainerGenerator, ItemCollection>(treeView.ItemContainerGenerator, treeView.Items) }; var collectionIndex = 0; while (collectionIndex < collectionsToVisit.Count) { var itemContainerGenerator = collectionsToVisit[collectionIndex].Item1; var itemCollection = collectionsToVisit[collectionIndex].Item2; for (var i = 0; i < itemCollection.Count; i++) { var tvi = itemContainerGenerator.ContainerFromIndex(i) as TreeViewItem; if (tvi == null) { continue; } if (tvi.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated) { collectionsToVisit.Add(new Tuple<ItemContainerGenerator, ItemCollection>(tvi.ItemContainerGenerator, tvi.Items)); } onBrowsedTreeViewItem(tvi); } collectionIndex++; } } } 

2 / XAML dosyanızdakı istifadə nümunəsi

 <TreeView myNS:BindableSelectedItem.SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}" /> 
1
24 мая '18 в 17:27 2018-05-24 17:27 cavab 24 may 1818 tarixində 17:27 2018-05-24 17:27 tarixində Kino101 tərəfindən verilir

XAML varsa

 <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 

Siyahıda bu maddəni tapmaqla yanlış nədir? Mən də istifadə edirəm

 <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 

Virtual maşında IsSelected = true etibarlı olduğundan əmin olmaq üçün valideynlər genişlənir.

0
30 июня '18 в 16:18 2018-06-30 16:18 Cavab Jym tərəfindən 30 İyun 1818'de 4:18 'də 2018-06-30 16:18' də verilir

(Hər kəs TreeView bu problemlə əlaqədar açıq şəkildə bloklandığını qəbul etsin. SelectedItem üçün məcbur olacaqdır).

IsSelected TreeViewItem mülkiyyəti ilə düzgün əlaqə yaratmaq üçün bir həll lazımdır, buna necə oldu?

 // the Type CustomThing needs to implement IsSelected with notification // for this to work. public class CustomTreeView : TreeView { public CustomThing SelectedCustomThing { get { return (CustomThing)GetValue(SelectedNode_Property); } set { SetValue(SelectedNode_Property, value); if(value != null) value.IsSelected = true; } } public static DependencyProperty SelectedNode_Property = DependencyProperty.Register( "SelectedCustomThing", typeof(CustomThing), typeof(CustomTreeView), new FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.None, SelectedNodeChanged)); public CustomTreeView(): base() { this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(SelectedItemChanged_CustomHandler); } void SelectedItemChanged_CustomHandler(object sender, RoutedPropertyChangedEventArgs<object> e) { SetValue(SelectedNode_Property, SelectedItem); } private static void SelectedNodeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var treeView = d as CustomTreeView; var newNode = e.NewValue as CustomThing; treeView.SelectedCustomThing = (CustomThing)e.NewValue; } } 

Bu XAML istifadə:

 <local:CustonTreeView ItemsSource="{Binding TreeRoot}" SelectedCustomThing="{Binding SelectedNode,Mode=TwoWay}"> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> </Style> </TreeView.ItemContainerStyle> </local:CustonTreeView> 
0
15 февр. Cavab 15 fevralda Eric Jorgensen tərəfindən verilir . 2018-02-15 05:36 '18 saat 05:36 'də 2018-02-15 05:36

Другие вопросы по меткам или Задайте вопрос