Well this is just a rough example but you could potentially handle it something like this from code behind.
XAML
<TreeView ...>
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="treeViewItem_PreviewMouseLeftButtonDown" />
</Style>
</TreeView.Resources>
...
</TreeView>
Some Helper Methods
public static T GetFirstAncestorOfType<T>(DependencyObject source) where T : class
{
while (source != null && !(source is T))
source = VisualTreeHelper.GetParent(source);
return source as T;
}
public static MessageBoxResult DoYouAgreeToMoveToAnotherItem()
{
return MessageBox.Show("Select a different item?", "Select?", MessageBoxButton.YesNo);
}
Code Behind
private TreeViewItem _selectedItem = null;
void treeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
TreeViewItem tvi = GetFirstAncestorOfType<TreeViewItem>(e.OriginalSource as DependencyObject);
if (_selectedItem != null &&
tvi != null &&
tvi != _selectedItem &&
MessageBoxResult.Yes != DoYouAgreeToMoveToAnotherItem())
{
e.Handled = true;
}
else
{
// Update _selectedItem for comparison the next time this method fires.
_selectedItem = tvi;
if(_selectedItem != null)
_selectedItem.IsSelected = true;
}
}
You could also likely accomplish this with pure MVVM. I don't have time to post an example using TreeView
but the solution might involve using Dispatcher
something like the solutions offered here...