Editing in WPF TreeView (SfTreeView)
8 Jul 202610 minutes to read
The TreeView provides support for editing. Editing can be enabled or disabled by using the SfTreeView.AllowEditing property. You can enter edit mode on a node by pressing the F2 key, and also by single-click or double-click, by setting the EditTrigger property. The edit changes for a node are committed only when the user moves to another node or presses the Enter key.
The EditTrigger property accepts the following values:
-
F2— Press F2 to start editing. This is the default. -
Tap— Single tap or click to start editing. -
DoubleTap— Double tap or double click to start editing.
It is necessary to define an EditTemplate or EditTemplateSelector for bound mode, to enable editing. For unbound mode, a TextBox is loaded in edit mode by default.
<syncfusion:SfTreeView x:Name="sfTreeView"
ItemsSource="{Binding Items}"
ChildPropertyName="Files"
AutoExpandMode="RootNodes"
AllowEditing="True"
>
<syncfusion:SfTreeView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
</DataTemplate>
</syncfusion:SfTreeView.ItemTemplate>
<syncfusion:SfTreeView.EditTemplate>
<DataTemplate>
<TextBox Text="{Binding Name}"
VerticalContentAlignment="Center"
Margin="-4,0,-4,0"
Height="{Binding ItemHeight,ElementName=sfTreeView}" />
</DataTemplate>
</syncfusion:SfTreeView.EditTemplate>
</syncfusion:SfTreeView>sfTreeView.AllowEditing = true;
Edit mode
By default, you can enter edit mode by pressing the F2 key. The TreeView also allows entering edit mode with a single click (Tap) or a double click (DoubleTap) by setting the EditTrigger property.
<syncfusion:SfTreeView x:Name="sfTreeView"
ItemsSource="{Binding Countries}"
AutoExpandMode="RootNodes"
EditTrigger="DoubleTap"
AllowEditing="True"/>this.sfTreeView.EditTrigger = Syncfusion.UI.Xaml.TreeView.TreeViewEditTrigger.DoubleTap;Programmatic Editing
Begin the editing
The TreeView allows you to start editing a node programmatically by calling the BeginEdit method.
this.sfTreeView.Loaded += TreeView_Loaded;
private void TreeView_Loaded(object sender, RoutedEventArgs e)
{
this.sfTreeView.BeginEdit(this.sfTreeView.Nodes[0]);
}NOTE
The CurrentItem is set to the node when
BeginEditis called.
End the editing
You can call the EndEdit method to programmatically end editing for a specific node.
this.sfTreeView.Loaded += TreeView_Loaded;
private void TreeView_Loaded(object sender, RoutedEventArgs e)
{
this.sfTreeView.EndEdit(this.sfTreeView.Nodes[0]);
}Revert the edited changes while pressing the Escape key
By default, the TreeView does not support rolling back changes when the ESC key is pressed while editing a node. It does support rolling back changes when the underlying data object implements the IEditableObject interface.
The user can take a backup of the existing data of a node in the BeginEdit method and revert to the previous values in the CancelEdit method to roll back the changes.
The following code example shows a simple implementation of the IEditableObject interface to roll back the changes.
public class Country : INotifyPropertyChanged, IEditableObject
{
private bool isSelected;
internal string name;
private ObservableCollection<State> states;
internal Country backUpData;
private Country currentData;
public Country()
{
}
public Country(string name):base()
{
this.currentData = new Country();
this.currentData.name = name;
this.currentData.isSelected = false;
}
public ObservableCollection<State> States
{
get
{
return states;
}
set
{
states = value;
RaisedOnPropertyChanged("States");
}
}
public string Name
{
get
{
return this.currentData.name;
}
set
{
this.currentData.name = value;
RaisedOnPropertyChanged("Name");
}
}
public bool IsSelected
{
get
{
return this.currentData.isSelected;
}
set
{
this.currentData.isSelected = value;
RaisedOnPropertyChanged("IsSelected");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisedOnPropertyChanged(string _PropertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(_PropertyName));
}
}
public void BeginEdit()
{
Debug.WriteLine("BeginEdit is Called.");
backUpData = new Country();
backUpData.name = this.currentData.name;
backUpData.isSelected = this.currentData.isSelected;
}
public void CancelEdit()
{
Debug.WriteLine("CancelEdit is Called.");
this.currentData = backUpData;
}
public void EndEdit()
{
Debug.WriteLine("EndEdit is Called.");
}
}NOTE
View sample in GitHub
Events
ItemBeginEdit Event
The ItemBeginEdit event occurs when the node enters edit mode. The TreeViewItemBeginEditEventArgs has the following members which provides information about the ItemBeginEdit event.
- Node : Gets the TreeViewNode which is being edited.
You can cancel the editing of certain nodes using custom logic within this event by setting TreeViewItemBeginEditEventArgs.Cancel as true.
sfTreeView.ItemBeginEdit += TreeView_ItemBeginEdit;
private void TreeView_ItemBeginEdit(object sender, TreeViewItemBeginEditEventArgs e)
{
if (e.Node.Content == "Grains")
e.Cancel = true;
}ItemEndEdit Event
The ItemEndEdit event occurs when the node leaves the edit mode. The TreeViewItemEndEditEventArgs has the following members which provides information about the ItemEndEdit event.
- Node : Gets the TreeViewNode which is being edited.
You can cancel the editing from being ended for certain nodes using custom logic within this event by setting TreeViewItemEndEditEventArgs.Cancel as true.
sfTreeView.ItemEndEdit += TreeView_ItemEndEdit;
private void TreeView_ItemEndEdit(object sender, TreeViewItemEndEditEventArgs e)
{
if (e.Node.Content == "Cereals")
e.Cancel = true;
}NOTE
You can refer to our WPF TreeView feature tour page for its key feature highlights. You can also explore our WPF TreeView example to know how to represent hierarchical data in a tree-like structure with expand and collapse node options.