Namespace Components
Public NotInheritable Class TreeViewBehavior
Public Shared Function GetIsTransparent(
ByVal element As TreeViewItem) As Boolean
If element Is Nothing Then Throw New ArgumentNullException("element")
Return element.GetValue(IsTransparentProperty)
End Function
Public Shared Sub SetIsTransparent(ByVal element As TreeViewItem,
ByVal value As Boolean)
If element Is Nothing Then Throw New ArgumentNullException("element")
element.SetValue(IsTransparentProperty, value)
End Sub
Public Shared ReadOnly IsTransparentProperty As DependencyProperty =
DependencyProperty.RegisterAttached("IsTransparent", GetType(Boolean),
GetType(TreeViewBehavior),
New FrameworkPropertyMetadata(False,
AddressOf IsTransparent_PropertyChanged))
Private Shared Sub IsTransparent_PropertyChanged(
ByVal sender As Object, ByVal e As DependencyPropertyChangedEventArgs)
Dim tvi = DirectCast(sender, TreeViewItem)
Dim isTransparent = CBool(e.NewValue)
If isTransparent Then
AddHandler tvi.Selected, AddressOf tvi_Selected
Else
RemoveHandler tvi.Selected, AddressOf tvi_Selected
End If
End Sub
Private Shared Sub tvi_Selected(ByVal sender As Object,
ByVal e As RoutedEventArgs)
Dim treeViewItem = DirectCast(sender, TreeViewItem)
If Not treeViewItem.IsSelected Then Exit Sub
treeViewItem.Dispatcher.Invoke(
Sub(tvi As TreeViewItem) tvi.IsSelected = False,
System.Windows.Threading.DispatcherPriority.Send,
treeViewItem)
End Sub
End Class
End Namespace
Я пробовал это, и у меня это сработало. Потому что у меня простое, а не динамическое древовидное представление. Но я думаю, что это может сработать, если оформить его в стиле
Я просто снял выделение с TreeViewItems по мере их выбора. Я использую TreeView только один раз. Однако, если бы я добавил это в нескольких местах, я бы подумал о том, чтобы добавить это в Attached Behavior.
private void TreeView_SelectionChanged(object sender, RoutedEventArgs e)
{
if (!(sender is TreeView myTreeView)) return;
var selectedItem = (TreeViewItem)myTreeView.SelectedItem;
if (selectedItem == null) return;
selectedItem.IsSelected = false;
}
Ответ 8 · Danield
Я сделал это иначе, чем принятый ответ:
Допустим, у вас есть свойство в вашей ViewModel (скажем, ShouldPreventSelection). Теперь, когда ShouldPreventSelection имеет значение true, вы хотите, чтобы выбор был отключен:
В вашем TreeView запустите событие PreviewSelected следующим образом: