diff --git a/Filtration/Filtration.csproj b/Filtration/Filtration.csproj
index 46eccf5..c28c718 100644
--- a/Filtration/Filtration.csproj
+++ b/Filtration/Filtration.csproj
@@ -112,6 +112,7 @@
+
@@ -189,7 +190,9 @@
AvalonDockWorkspaceView.xaml
+
+
BlockGroupBrowserView.xaml
@@ -367,6 +370,8 @@
+
+
Always
diff --git a/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs b/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs
index d9eb107..25b8fff 100644
--- a/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs
+++ b/Filtration/Models/BlockItemTypes/FontSizeBlockItem.cs
@@ -6,6 +6,7 @@ namespace Filtration.Models.BlockItemTypes
{
public FontSizeBlockItem()
{
+ Value = 35;
}
public FontSizeBlockItem(int value) : base(value)
diff --git a/Filtration/Models/ItemFilterBlock.cs b/Filtration/Models/ItemFilterBlock.cs
index 3279ee3..241038a 100644
--- a/Filtration/Models/ItemFilterBlock.cs
+++ b/Filtration/Models/ItemFilterBlock.cs
@@ -75,6 +75,25 @@ namespace Filtration.Models
return BlockItems.Count(b => b is T) > 0;
}
+ public bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup)
+ {
+ if (startingBlockGroup == targetBlockGroup)
+ {
+ return true;
+ }
+ if (BlockGroup == null)
+ {
+ return false;
+ }
+
+ if (startingBlockGroup.ParentGroup != null)
+ {
+ return HasBlockGroupInParentHierarchy(targetBlockGroup, startingBlockGroup.ParentGroup);
+ }
+
+ return false;
+ }
+
private void OnBlockGroupStatusChanged(object sender, EventArgs e)
{
if (BlockGroup.IsChecked == false && Action == BlockAction.Show)
diff --git a/Filtration/Resources/Icons/clear_filter_icon.png b/Filtration/Resources/Icons/clear_filter_icon.png
new file mode 100644
index 0000000..91ca9aa
Binary files /dev/null and b/Filtration/Resources/Icons/clear_filter_icon.png differ
diff --git a/Filtration/Resources/Icons/filter_icon.png b/Filtration/Resources/Icons/filter_icon.png
new file mode 100644
index 0000000..1470188
Binary files /dev/null and b/Filtration/Resources/Icons/filter_icon.png differ
diff --git a/Filtration/Translators/ItemFilterScriptTranslator.cs b/Filtration/Translators/ItemFilterScriptTranslator.cs
index bb68b48..98cd467 100644
--- a/Filtration/Translators/ItemFilterScriptTranslator.cs
+++ b/Filtration/Translators/ItemFilterScriptTranslator.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
+using Castle.Core.Internal;
using Filtration.Models;
using Filtration.Utilities;
@@ -43,7 +44,11 @@ namespace Filtration.Translators
script.Description += lines[i].Substring(1).Trim(' ') + Environment.NewLine;
}
}
- script.Description = script.Description.TrimEnd('\n').TrimEnd('\r');
+
+ if (!script.Description.IsNullOrEmpty())
+ {
+ script.Description = script.Description.TrimEnd('\n').TrimEnd('\r');
+ }
// Extract each block from between boundaries and translate it into a ItemFilterBlock object
// and add that object to the ItemFilterBlocks list
diff --git a/Filtration/ViewModels/ItemFilterBlockViewModel.cs b/Filtration/ViewModels/ItemFilterBlockViewModel.cs
index a16be84..a9cc44b 100644
--- a/Filtration/ViewModels/ItemFilterBlockViewModel.cs
+++ b/Filtration/ViewModels/ItemFilterBlockViewModel.cs
@@ -10,6 +10,7 @@ using Filtration.Models.BlockItemTypes;
using Filtration.Services;
using Filtration.Views;
using GalaSoft.MvvmLight.CommandWpf;
+using Xceed.Wpf.Toolkit;
namespace Filtration.ViewModels
{
@@ -188,11 +189,25 @@ namespace Filtration.ViewModels
}
set
{
- Block.Description = value;
- RaisePropertyChanged();
+ if (Block.Description != value)
+ {
+ Block.Description = value;
+ IsDirty = true;
+ RaisePropertyChanged();
+ }
}
}
-
+
+ public ObservableCollection AvailableColors
+ {
+ get
+ {
+ {
+ return PathOfExileColors.DefaultColors;
+ }
+ }
+ }
+
public bool HasTextColor
{
get { return Block.HasBlockItemOfType(); }
diff --git a/Filtration/ViewModels/ItemFilterScriptViewModel.cs b/Filtration/ViewModels/ItemFilterScriptViewModel.cs
index fb05cb8..d9ba011 100644
--- a/Filtration/ViewModels/ItemFilterScriptViewModel.cs
+++ b/Filtration/ViewModels/ItemFilterScriptViewModel.cs
@@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Windows;
+using System.Windows.Data;
using System.Windows.Forms;
using Castle.Core.Internal;
+using Filtration.Enums;
using Filtration.Models;
using Filtration.Services;
using Filtration.Translators;
@@ -22,11 +25,12 @@ namespace Filtration.ViewModels
IItemFilterBlockViewModel SectionBrowserSelectedBlockViewModel { get; set; }
IEnumerable BlockGroups { get; }
IEnumerable ItemFilterSectionViewModels { get; }
+ Predicate BlockFilterPredicate { get; set; }
bool IsDirty { get; }
string Description { get; set; }
string DisplayName { get; }
- void Initialise(ItemFilterScript itemFilterScript);
+ void Initialise(ItemFilterScript itemFilterScript, bool newScript);
void RemoveDirtyFlag();
void SaveScript();
void SaveScriptAs();
@@ -47,12 +51,23 @@ namespace Filtration.ViewModels
private bool _isDirty;
private IItemFilterBlockViewModel _selectedBlockViewModel;
private IItemFilterBlockViewModel _sectionBrowserSelectedBlockViewModel;
+ private readonly ObservableCollection _itemFilterBlockViewModels;
+ private ICollectionView _itemFilterBlockViewModelsCollectionView;
+ private Predicate _blockFilterPredicate;
public ItemFilterScriptViewModel(IItemFilterBlockViewModelFactory itemFilterBlockViewModelFactory,
IItemFilterBlockTranslator blockTranslator,
IAvalonDockWorkspaceViewModel avalonDockWorkspaceViewModel,
IItemFilterPersistenceService persistenceService)
{
+ _itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory;
+ _blockTranslator = blockTranslator;
+ _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel;
+ _avalonDockWorkspaceViewModel.ActiveDocumentChanged += OnActiveDocumentChanged;
+ _persistenceService = persistenceService;
+ _itemFilterBlockViewModels = new ObservableCollection();
+
+ ClearFilterCommand = new RelayCommand(OnClearFilterCommand, () => BlockFilterPredicate != null);
CloseCommand = new RelayCommand(OnCloseCommand);
DeleteBlockCommand = new RelayCommand(OnDeleteBlockCommand, () => SelectedBlockViewModel != null);
MoveBlockToTopCommand = new RelayCommand(OnMoveBlockToTopCommand, () => SelectedBlockViewModel != null);
@@ -63,13 +78,9 @@ namespace Filtration.ViewModels
AddSectionCommand = new RelayCommand(OnAddSectionCommand, () => SelectedBlockViewModel != null);
CopyBlockCommand = new RelayCommand(OnCopyBlockCommand, () => SelectedBlockViewModel != null);
PasteBlockCommand = new RelayCommand(OnPasteBlockCommand, () => SelectedBlockViewModel != null);
- _itemFilterBlockViewModelFactory = itemFilterBlockViewModelFactory;
- _blockTranslator = blockTranslator;
- _avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel;
- _persistenceService = persistenceService;
- ItemFilterBlockViewModels = new ObservableCollection();
}
+ public RelayCommand ClearFilterCommand { get; private set; }
public RelayCommand CloseCommand { get; private set; }
public RelayCommand DeleteBlockCommand { get; private set; }
public RelayCommand MoveBlockToTopCommand { get; private set; }
@@ -81,8 +92,43 @@ namespace Filtration.ViewModels
public RelayCommand CopyBlockCommand { get; private set; }
public RelayCommand PasteBlockCommand { get; private set; }
- public ObservableCollection ItemFilterBlockViewModels { get; private set; }
+ public ObservableCollection ItemFilterBlockViewModels
+ {
+ get
+ {
+ _itemFilterBlockViewModelsCollectionView =
+ CollectionViewSource.GetDefaultView(_itemFilterBlockViewModels);
+ if (BlockFilterPredicate != null)
+ {
+ _itemFilterBlockViewModelsCollectionView.Filter = BlockFilter;
+ }
+ else
+ {
+ _itemFilterBlockViewModelsCollectionView.Filter = null;
+ }
+ return _itemFilterBlockViewModels;
+
+ }
+ }
+ private bool BlockFilter(object item)
+ {
+ var blockViewModel = item as IItemFilterBlockViewModel;
+ return BlockFilterPredicate(blockViewModel);
+ }
+
+ public Predicate BlockFilterPredicate
+ {
+ get { return _blockFilterPredicate; }
+ set
+ {
+ _blockFilterPredicate = value;
+ RaisePropertyChanged("ItemFilterBlockViewModels");
+ }
+ }
+
+ public ObservableCollection DisplayedItemFilterBlockViewModels { get; private set; }
+
public IEnumerable ItemFilterSectionViewModels
{
get { return ItemFilterBlockViewModels.Where(b => b.Block.GetType() == typeof (ItemFilterSection)); }
@@ -99,7 +145,7 @@ namespace Filtration.ViewModels
set
{
Script.Description = value;
- _isDirty = true;
+ IsDirty = true;
RaisePropertyChanged();
}
}
@@ -137,20 +183,19 @@ namespace Filtration.ViewModels
get { return _isDirty || HasDirtyChildren; }
set
{
- _isDirty = value;
- }
- }
+ if (_isDirty != value)
+ {
+ _isDirty = value;
+ if (_isDirty)
+ {
+ Title = Filename + "*";
+ }
+ else
+ {
+ Title = Filename;
+ }
+ }
- private bool HasDirtyChildren
- {
- get { return ItemFilterBlockViewModels.Any(vm => vm.IsDirty); }
- }
-
- private void CleanChildren()
- {
- foreach (var vm in ItemFilterBlockViewModels)
- {
- vm.IsDirty = false;
}
}
@@ -177,7 +222,9 @@ namespace Filtration.ViewModels
get { return Script.FilePath; }
}
- public void Initialise(ItemFilterScript itemFilterScript)
+ private bool _filenameIsFake;
+
+ public void Initialise(ItemFilterScript itemFilterScript, bool newScript)
{
ItemFilterBlockViewModels.Clear();
@@ -189,6 +236,13 @@ namespace Filtration.ViewModels
ItemFilterBlockViewModels.Add(vm);
}
+ _filenameIsFake = newScript;
+
+ if (newScript)
+ {
+ Script.FilePath = "Untitled.filter";
+ }
+
Title = Filename;
ContentId = "testcontentid";
}
@@ -197,7 +251,7 @@ namespace Filtration.ViewModels
{
if (!ValidateScript()) return;
- if (string.IsNullOrEmpty(Script.FilePath))
+ if (_filenameIsFake)
{
SaveScriptAs();
return;
@@ -235,6 +289,8 @@ namespace Filtration.ViewModels
{
Script.FilePath = saveDialog.FileName;
_persistenceService.SaveItemFilterScript(Script);
+ _filenameIsFake = false;
+ Title = Filename;
RemoveDirtyFlag();
}
catch (Exception e)
@@ -245,6 +301,27 @@ namespace Filtration.ViewModels
}
}
+ private void OnActiveDocumentChanged(object sender, EventArgs e)
+ {
+ if (_avalonDockWorkspaceViewModel.ActiveScriptViewModel != this)
+ {
+ BlockFilterPredicate = null;
+ }
+ }
+
+ private bool HasDirtyChildren
+ {
+ get { return ItemFilterBlockViewModels.Any(vm => vm.IsDirty); }
+ }
+
+ private void CleanChildren()
+ {
+ foreach (var vm in ItemFilterBlockViewModels)
+ {
+ vm.IsDirty = false;
+ }
+ }
+
private bool ValidateScript()
{
var result = Script.Validate();
@@ -265,11 +342,16 @@ namespace Filtration.ViewModels
return false;
}
+ private void OnCloseCommand()
+ {
+ Close();
+ }
+
public void Close()
{
if (!IsDirty)
{
- _avalonDockWorkspaceViewModel.CloseDocument(this);
+ CloseScript();
}
else
{
@@ -280,12 +362,12 @@ namespace Filtration.ViewModels
case MessageBoxResult.Yes:
{
SaveScript();
- _avalonDockWorkspaceViewModel.CloseDocument(this);
+ CloseScript();
break;
}
case MessageBoxResult.No:
{
- _avalonDockWorkspaceViewModel.CloseDocument(this);
+ CloseScript();
break;
}
case MessageBoxResult.Cancel:
@@ -296,9 +378,15 @@ namespace Filtration.ViewModels
}
}
- private void OnCloseCommand()
+ private void CloseScript()
{
- Close();
+ _avalonDockWorkspaceViewModel.ActiveDocumentChanged -= OnActiveDocumentChanged;
+ _avalonDockWorkspaceViewModel.CloseDocument(this);
+ }
+
+ private void OnClearFilterCommand()
+ {
+ BlockFilterPredicate = null;
}
private void OnCopyBlockCommand()
@@ -339,7 +427,7 @@ namespace Filtration.ViewModels
}
SelectedBlockViewModel = vm;
- _isDirty = true;
+ IsDirty = true;
}
@@ -359,7 +447,7 @@ namespace Filtration.ViewModels
Script.ItemFilterBlocks.Remove(block);
Script.ItemFilterBlocks.Insert(0, block);
ItemFilterBlockViewModels.Move(currentIndex, 0);
- _isDirty = true;
+ IsDirty = true;
RaisePropertyChanged("ItemFilterSectionViewModels");
}
}
@@ -380,7 +468,7 @@ namespace Filtration.ViewModels
Script.ItemFilterBlocks.RemoveAt(blockPos);
Script.ItemFilterBlocks.Insert(blockPos - 1, block);
ItemFilterBlockViewModels.Move(currentIndex, currentIndex - 1);
- _isDirty = true;
+ IsDirty = true;
RaisePropertyChanged("ItemFilterSectionViewModels");
}
}
@@ -401,7 +489,7 @@ namespace Filtration.ViewModels
Script.ItemFilterBlocks.RemoveAt(blockPos);
Script.ItemFilterBlocks.Insert(blockPos + 1, block);
ItemFilterBlockViewModels.Move(currentIndex, currentIndex + 1);
- _isDirty = true;
+ IsDirty = true;
RaisePropertyChanged("ItemFilterSectionViewModels");
}
}
@@ -421,7 +509,7 @@ namespace Filtration.ViewModels
Script.ItemFilterBlocks.Remove(block);
Script.ItemFilterBlocks.Add(block);
ItemFilterBlockViewModels.Move(currentIndex, ItemFilterBlockViewModels.Count - 1);
- _isDirty = true;
+ IsDirty = true;
RaisePropertyChanged("ItemFilterSectionViewModels");
}
}
@@ -449,7 +537,7 @@ namespace Filtration.ViewModels
}
SelectedBlockViewModel = vm;
- _isDirty = true;
+ IsDirty = true;
}
private void OnAddSectionCommand()
@@ -465,7 +553,7 @@ namespace Filtration.ViewModels
Script.ItemFilterBlocks.Insert(Script.ItemFilterBlocks.IndexOf(targetBlockViewModel.Block) + 1, newSection);
ItemFilterBlockViewModels.Insert(ItemFilterBlockViewModels.IndexOf(targetBlockViewModel) + 1, vm);
- _isDirty = true;
+ IsDirty = true;
SelectedBlockViewModel = vm;
RaisePropertyChanged("ItemFilterSectionViewModels");
}
@@ -484,7 +572,7 @@ namespace Filtration.ViewModels
{
Script.ItemFilterBlocks.Remove(targetBlockViewModel.Block);
ItemFilterBlockViewModels.Remove(targetBlockViewModel);
- _isDirty = true;
+ IsDirty = true;
}
SelectedBlockViewModel = null;
}
diff --git a/Filtration/ViewModels/MainWindowViewModel.cs b/Filtration/ViewModels/MainWindowViewModel.cs
index 0a0804e..925e7cc 100644
--- a/Filtration/ViewModels/MainWindowViewModel.cs
+++ b/Filtration/ViewModels/MainWindowViewModel.cs
@@ -43,7 +43,6 @@ namespace Filtration.ViewModels
_replaceColorsViewModel = replaceColorsViewModel;
_avalonDockWorkspaceViewModel = avalonDockWorkspaceViewModel;
-
OpenAboutWindowCommand = new RelayCommand(OnOpenAboutWindowCommand);
OpenScriptCommand = new RelayCommand(OnOpenScriptCommand);
SaveScriptCommand = new RelayCommand(OnSaveScriptCommand, ActiveDocumentIsScript);
@@ -76,6 +75,16 @@ namespace Filtration.ViewModels
ReplaceColorsCommand.RaiseCanExecuteChanged();
break;
}
+ case "NewScript":
+ {
+ OnNewScriptCommand();
+ break;
+ }
+ case "OpenScript":
+ {
+ OnOpenScriptCommand();
+ break;
+ }
}
});
}
@@ -145,7 +154,7 @@ namespace Filtration.ViewModels
}
var newViewModel = _itemFilterScriptViewModelFactory.Create();
- newViewModel.Initialise(loadedScript);
+ newViewModel.Initialise(loadedScript, false);
_avalonDockWorkspaceViewModel.AddDocument(newViewModel);
}
@@ -208,8 +217,7 @@ namespace Filtration.ViewModels
{
var newScript = new ItemFilterScript();
var newViewModel = _itemFilterScriptViewModelFactory.Create();
- newViewModel.Initialise(newScript);
- newViewModel.Description = "New Script";
+ newViewModel.Initialise(newScript, true);
_avalonDockWorkspaceViewModel.AddDocument(newViewModel);
}
diff --git a/Filtration/ViewModels/ReplaceColorsViewModel.cs b/Filtration/ViewModels/ReplaceColorsViewModel.cs
index 176296a..8c379c4 100644
--- a/Filtration/ViewModels/ReplaceColorsViewModel.cs
+++ b/Filtration/ViewModels/ReplaceColorsViewModel.cs
@@ -1,8 +1,11 @@
-using System.Linq;
+using System.Collections.ObjectModel;
+using System.Linq;
using System.Windows.Media;
using Filtration.Models;
using Filtration.Models.BlockItemTypes;
+using Filtration.Views;
using GalaSoft.MvvmLight.CommandWpf;
+using Xceed.Wpf.Toolkit;
namespace Filtration.ViewModels
{
@@ -58,6 +61,16 @@ namespace Filtration.ViewModels
_itemFilterScript = itemFilterScript;
}
+ public ObservableCollection AvailableColors
+ {
+ get
+ {
+ {
+ return PathOfExileColors.DefaultColors;
+ }
+ }
+ }
+
public Color NewTextColor
{
get { return _replaceColorsParameterSet.NewTextColor; }
diff --git a/Filtration/ViewModels/StartPageViewModel.cs b/Filtration/ViewModels/StartPageViewModel.cs
index fd810da..2c9d4b9 100644
--- a/Filtration/ViewModels/StartPageViewModel.cs
+++ b/Filtration/ViewModels/StartPageViewModel.cs
@@ -1,4 +1,5 @@
using GalaSoft.MvvmLight.CommandWpf;
+using GalaSoft.MvvmLight.Messaging;
namespace Filtration.ViewModels
{
@@ -12,12 +13,23 @@ namespace Filtration.ViewModels
public StartPageViewModel()
{
Title = "Start Page";
+ OpenScriptCommand = new RelayCommand(OnOpenScriptCommand);
+ NewScriptCommand = new RelayCommand(OnNewScriptCommand);
}
- // TODO: Replace with MVVMLight ViewModel Messages
- public RelayCommand OpenScriptCommand { get { return null; } }
- public RelayCommand NewScriptCommand { get { return null; } }
+ public RelayCommand OpenScriptCommand { get; private set; }
+ public RelayCommand NewScriptCommand { get; private set; }
public bool IsScript { get { return false; } }
+
+ private static void OnOpenScriptCommand()
+ {
+ Messenger.Default.Send(new NotificationMessage("OpenScript"));
+ }
+
+ private static void OnNewScriptCommand()
+ {
+ Messenger.Default.Send(new NotificationMessage("NewScript"));
+ }
}
}
diff --git a/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml
index 895f80c..24f9ab9 100644
--- a/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml
+++ b/Filtration/Views/AvalonDock/AvalonDockWorkspaceView.xaml
@@ -22,7 +22,7 @@
AnchorablesSource="{Binding Tools}"
AllowMixedOrientation="True"
DocumentsSource="{Binding OpenDocuments}"
- ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}">
+ ActiveContent="{Binding ActiveDocument, Mode=TwoWay, Converter={StaticResource ActiveDocumentConverter}}" >
@@ -79,7 +79,7 @@
-
+
diff --git a/Filtration/Views/AvalonDock/LayoutInitializer.cs b/Filtration/Views/AvalonDock/LayoutInitializer.cs
index bb6780c..9d36602 100644
--- a/Filtration/Views/AvalonDock/LayoutInitializer.cs
+++ b/Filtration/Views/AvalonDock/LayoutInitializer.cs
@@ -1,4 +1,6 @@
-using Xceed.Wpf.AvalonDock.Layout;
+using System.Linq;
+using Filtration.ViewModels;
+using Xceed.Wpf.AvalonDock.Layout;
namespace Filtration.Views.AvalonDock
{
@@ -14,6 +16,16 @@ namespace Filtration.Views.AvalonDock
destinationContainer.FindParent() != null)
return false;
+ if (anchorableToShow.Content is SectionBrowserViewModel)
+ {
+ var toolsPane = layout.Descendents().OfType().FirstOrDefault(d => d.Name == "SectionBrowserPane");
+ if (toolsPane != null)
+ {
+ anchorableToShow.CanHide = false;
+ toolsPane.Children.Add(anchorableToShow);
+ return true;
+ }
+ }
//if (anchorableToShow.ContentId == "SectionBrowserTool")
//{
// var toolsPane = layout.Descendents().OfType().FirstOrDefault(d => d.Name == "SectionBrowserPane");
diff --git a/Filtration/Views/Behaviors/BindableSelectedItemBehavior.cs b/Filtration/Views/Behaviors/BindableSelectedItemBehavior.cs
new file mode 100644
index 0000000..6a82b47
--- /dev/null
+++ b/Filtration/Views/Behaviors/BindableSelectedItemBehavior.cs
@@ -0,0 +1,55 @@
+// Taken from http://stackoverflow.com/a/5118406/4153185
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Interactivity;
+
+namespace Filtration.Views.Behaviors
+{
+ internal class BindableSelectedItemBehavior : Behavior
+ {
+ #region SelectedItem Property
+
+ public object SelectedItem
+ {
+ get { return 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();
+
+ AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
+ }
+
+ protected override void OnDetaching()
+ {
+ base.OnDetaching();
+
+ if (AssociatedObject != null)
+ {
+ AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
+ }
+ }
+
+ private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs