Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 25 additions & 11 deletions Samples/SimpleEditSample/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=DotNetProjects.TreeViewEx"
xmlns:Model="clr-namespace:W7StyleSample.Model"
Title="MainWindow" Height="350" Width="261"
Title="MainWindow" Height="350" Width="521"
AutomationProperties.Name="TestApp2Window" >
<Window.Resources>
<Style TargetType="Controls:TreeViewExItem">
<EventSetter Event="OnEditing" Handler="TreeViewExItem_OnEditing" />
<EventSetter Event="OnEdited" Handler="TreeViewExItem_OnEdited" />
<Setter Property="IsExpanded" Value="{Binding IsExpandedValue}"/>
<Setter Property="IsEditable" Value="True" />
<Setter Property="IsEditing" Value="{Binding IsEditingValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="TemplateEdit">
<Setter.Value>
<DataTemplate>
Expand All @@ -19,15 +22,26 @@
</Setter>
</Style>
</Window.Resources>
<DockPanel>
<Controls:TreeViewEx
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="261" />
<ColumnDefinition Width="260" />
</Grid.ColumnDefinitions>
<DockPanel Grid.Column="0">
<Controls:TreeViewEx
AutomationProperties.Name="TestApp2Tree"
ItemsSource="{Binding Children}">
<Controls:TreeViewEx.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}" DataType="{x:Type Model:Node}">
<TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
</Controls:TreeViewEx.ItemTemplate>
</Controls:TreeViewEx>
</DockPanel>
SelectedItems="{Binding SelectedItems}"
ItemsSource="{Binding FirstNode.Children}">
<Controls:TreeViewEx.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}" DataType="{x:Type Model:Node}">
<TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
</Controls:TreeViewEx.ItemTemplate>
</Controls:TreeViewEx>
</DockPanel>
<StackPanel Grid.Column="1">
<Button VerticalAlignment="Top" Content="Click me to edit selected item" Command="{Binding IsEditingCommand}" />
<TextBlock Margin="5 10 0 0" Text="{Binding EditedText, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Grid>
</Window>
47 changes: 20 additions & 27 deletions Samples/SimpleEditSample/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace W7StyleSample
{
using TreeViewEx.SimpleSample.ViewModel;
#region

using W7StyleSample.Model;
Expand All @@ -15,37 +16,29 @@ public partial class MainWindow

public MainWindow()
{
var firstNode = new Node { Name = "element" };
var first1 = new Node { Name = "element1" };
var first2 = new Node { Name = "element2" };
var first11 = new Node { Name = "element11" };
var first12 = new Node { Name = "element12" };
var first13 = new Node { Name = "element13", IsExpandedValue = false };
var first14 = new Node { Name = "element14", IsExpandedValue = false };
var first15 = new Node { Name = "element15" };
var first131 = new Node { Name = "element131" };
var first132 = new Node { Name = "element132" };

for (int i = 1; i <= 50; i++)
{
first14.Children.Add(new Node { Name = "element14_" + i });
}

firstNode.Children.Add(first1);
firstNode.Children.Add(first2);
first1.Children.Add(first11);
first1.Children.Add(first12);
first1.Children.Add(first13);
first1.Children.Add(first14);
first1.Children.Add(first15);
first13.Children.Add(first131);
first13.Children.Add(first132);

DataContext = firstNode;
DataContext = new MainWindowViewModel();

InitializeComponent();
}

#endregion

private void TreeViewExItem_OnEditing(object sender, System.Windows.RoutedEventArgs e)
{
var tvei = (System.Windows.Controls.TreeViewExItem)sender;
Node nodeContext = (Node)tvei.DataContext;
var viewModel = (MainWindowViewModel)DataContext;
viewModel.EditedText = $"{nodeContext.Name} is being edited.";
e.Handled = true;
}

private void TreeViewExItem_OnEdited(object sender, System.Windows.RoutedEventArgs e)
{
var tvei = (System.Windows.Controls.TreeViewExItem)sender;
Node nodeContext = (Node)tvei.DataContext;
var viewModel = (MainWindowViewModel)DataContext;
viewModel.EditedText = $"{nodeContext.Name} was edited.";
e.Handled = true;
}
}
}
24 changes: 19 additions & 5 deletions Samples/SimpleEditSample/Model/Node.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
#region

using System.Collections.ObjectModel;
using System.ComponentModel;

#endregion
#endregion

/// <summary>
/// Model for testing
/// </summary>
public class Node
/// <summary>
/// Model for testing
/// </summary>
public class Node : INotifyPropertyChanged
{
#region Constructors and Destructors

Expand All @@ -27,6 +28,19 @@ public Node()
string name;
public string Name { get { return name; } set { name = value; } }
public bool IsExpandedValue { get; set; }
private bool _isEditingValue;

public event PropertyChangedEventHandler PropertyChanged;

public bool IsEditingValue
{
get => _isEditingValue;
set
{
_isEditingValue = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsEditingValue)));
}
}
#endregion

#region Public Methods
Expand Down
57 changes: 57 additions & 0 deletions Samples/SimpleEditSample/RelayCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Input;

namespace DragNDropSample
{
public class RelayCommand : ICommand
{
#region Fields

readonly Action<object> execute;
readonly Predicate<object> canExecute;

#endregion // Fields

#region Constructors

public RelayCommand(Action<object> execute)
: this(execute, null)
{
}

public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");

this.execute = execute;
this.canExecute = canExecute;
}
#endregion // Constructors

#region ICommand Members

[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
return canExecute == null ? true : canExecute(parameter);
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

public void Execute(object parameter)
{
execute(parameter);
}

#endregion // ICommand Members
}
}
2 changes: 2 additions & 0 deletions Samples/SimpleEditSample/SimpleEditSample.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="RelayCommand.cs" />
<Compile Include="ViewModel\MainWindowViewModel.cs" />
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
Expand Down
81 changes: 81 additions & 0 deletions Samples/SimpleEditSample/ViewModel/MainWindowViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
using DragNDropSample;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows.Input;
using W7StyleSample.Model;

namespace TreeViewEx.SimpleSample.ViewModel
{
public class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private ICommand _isEditingCommand;
public ICommand IsEditingCommand
{
get
{
if (_isEditingCommand == null)
_isEditingCommand = new RelayCommand(EditItem);
return _isEditingCommand;
}
}

public Node FirstNode { get; set; }
public ObservableCollection<Node> SelectedItems { get; set; }
private string _editedText;
public string EditedText
{
get => _editedText;
set
{
_editedText = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(EditedText)));
}
}
public bool IsButtonEditEnabled
{
get { return SelectedItems.Count == 1; }
}

public MainWindowViewModel()
{
SelectedItems = new ObservableCollection<Node>();
FirstNode = new Node { Name = "element" };
var first1 = new Node { Name = "element1" };
var first2 = new Node { Name = "element2" };
var first11 = new Node { Name = "element11" };
var first12 = new Node { Name = "element12" };
var first13 = new Node { Name = "element13", IsExpandedValue = false };
var first14 = new Node { Name = "element14", IsExpandedValue = false };
var first15 = new Node { Name = "element15" };
var first131 = new Node { Name = "element131" };
var first132 = new Node { Name = "element132" };

for (int i = 1; i <= 50; i++)
{
first14.Children.Add(new Node { Name = "element14_" + i });
}

FirstNode.Children.Add(first1);
FirstNode.Children.Add(first2);
first1.Children.Add(first11);
first1.Children.Add(first12);
first1.Children.Add(first13);
first1.Children.Add(first14);
first1.Children.Add(first15);
first13.Children.Add(first131);
first13.Children.Add(first132);
}

private void EditItem(object parameter)
{
if (SelectedItems.Any())
SelectedItems[0].IsEditingValue = !SelectedItems[0].IsEditingValue;
}
}
}
14 changes: 10 additions & 4 deletions TreeViewEx/Controls/IsEditingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,30 @@ public IsEditingManager(TreeViewEx treeview)
internal override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
StopEditing();
StopEditing(true);
}

public void StartEditing(TreeViewExItem item)
{
StopEditing();
StopEditing(false);
editedItem = item;
editedItem.IsEditingCallbackEnabled = false;
editedItem.IsEditing = true;
editedItem.IsEditingCallbackEnabled = true;
}

internal void StopEditing()
internal void StopEditing(bool raiseEvent)
{
if (editedItem == null) return;

Keyboard.Focus(editedItem);
editedItem.IsEditingCallbackEnabled = false;
editedItem.IsEditing = false;
editedItem.IsEditingCallbackEnabled = true;
FocusHelper.Focus(editedItem);
if(raiseEvent)
editedItem.RaiseOnEdited();
editedItem = null;
}
}
}
}
Loading