איך לעשות 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 זה מראה שיש לך הרבה רצון ויוזמה
בהצלחה
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות