איך לעשות WPF Binding ב- TreeView
-
אני מנסה ללמוד קצת יותר על binding בפקד TreeView ב WPF על פי הכתבה הזו:
https://wpf-tutorial.com/treeview-control/treeview-data-binding-multiple-templates/
https://wpf-tutorial.com/treeview-control/handling-selection-expansion-state/את השלב הראשון של binding ל-Hirarchy הצלחתי לעשות
אבל את השלב השני של binding לפעולות של ISEXPANDED ו ISSELCTED אני לא מצליח לעשות כלומר זה לא עובד לי
אשמח לקבל הדרכה בעניין ממי שיכול. תודה מראשמצו"ב הקוד שעשיתי.
<Window x:Class="WPF_BInding.TreeViewBinding" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WPF_BInding" mc:Ignorable="d" Title="TreeViewBinding" Height="450" Width="800"> <Grid> <StackPanel> <TreeView x:Name="treeView"> <TreeView.ItemTemplate> <HierarchicalDataTemplate DataType="{x:Type local:myTreeViewItem}" ItemsSource="{Binding Items}"> <TextBlock Text="{Binding Header}" Tag="{Binding Tag}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Setter Property="IsSelected" Value="{Binding IsSelected}" /> <Setter Property="IsExpanded" Value="{Binding IsExpanded}" /> </Style> </TreeView.ItemContainerStyle> </TreeView> <WrapPanel> <Button Name="btnSelectNext" Click="btnSelectNext_Click" Width="120">Select next</Button> <Button Name="btnToggleExpansion" Click="btnToggleExpansion_Click" Width="120" Margin="10,0,0,0">Toggle expansion</Button> </WrapPanel> </StackPanel> </Grid> </Window>
using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; namespace WPF_BInding { /// <summary> /// Interaction logic for TreeViewBinding.xaml /// </summary> public class myTreeViewItem : TreeViewItemBase { public string Header { get; set; } public string Tag { get; set; } public ObservableCollection<myTreeViewItem> Items { get; set; } = new ObservableCollection<myTreeViewItem>(); } public class TreeViewItemBase : INotifyPropertyChanged { private bool _isSelected; private bool _isExpanded; public bool IsSelected { get { return this._isSelected; } set { if (value != this._isSelected) { this._isSelected = value; NotifyPropertyChanged("_isSelected"); } } } public bool IsExpanded { get { return this._isExpanded; } set { if (value != this._isExpanded) { this._isExpanded = value; NotifyPropertyChanged("_isExpanded"); } } } public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string propName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } public partial class TreeViewBinding : Window { public TreeViewBinding() { InitializeComponent(); List<myTreeViewItem> items = new List<myTreeViewItem>(); myTreeViewItem rootItem = new myTreeViewItem { Header = "root", IsExpanded = false }; myTreeViewItem child1 = new myTreeViewItem { Header = "child 1" , IsExpanded = false}; myTreeViewItem child2 = new myTreeViewItem { Header = "child 2", IsExpanded = false }; rootItem.Items.Add(child1); rootItem.Items.Add(child2); myTreeViewItem rootItem2 = new myTreeViewItem { Header = "root", IsExpanded = false }; myTreeViewItem child3 = new myTreeViewItem { Header = "child 1", IsExpanded = false }; myTreeViewItem child4 = new myTreeViewItem { Header = "child 2", IsExpanded = false }; rootItem2.Items.Add(child3); rootItem2.Items.Add(child4); items.Add(rootItem); items.Add(rootItem2); treeView.ItemsSource = items; } private void btnSelectNext_Click(object sender, RoutedEventArgs e) { } private void btnToggleExpansion_Click(object sender, RoutedEventArgs e) { if (treeView.SelectedItem != null) { myTreeViewItem treeViewItem = treeView.SelectedItem as myTreeViewItem; if (treeViewItem != null) { treeViewItem.IsExpanded = !treeViewItem.IsExpanded; } } } } }
-
שתי נקודות חשובות
- PropertyChanged מודיע למסך שהערך השתנה ולכן אתה צריך להשים את השם של הערך שהכנסת בxaml למשל במקום
NotifyPropertyChanged("_isExpanded");
תכתוב
NotifyPropertyChanged("IsExpanded");
או יותר טוב תשתמש ב nameof
NotifyPropertyChanged(nameof(IsExpanded));
- בקשר לשאלה שלך זה הקוד המתוקן
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
אגב מדהים לראות את ההתקדמות שלך בxaml זה מראה שיש לך הרבה רצון ויוזמה
בהצלחה