是否有一种不错的方法(除了重新模拟整个TreeViewItem.Template
)以禁用TreeView
中的选择?
我基本上在寻找ItemsControl
TreeView
的{{1}}风格(ItemsControl
ListBox
最适合{禁用'{{1}}上的选择,请阅读{{3} } post)
答案 0 :(得分:18)
试试这个:
<Trigger Property="HasItems" Value="true">
<Setter Property="Focusable" Value="false" />
</Trigger>
答案 1 :(得分:3)
根据当前接受的答案的链接,我在我的项目中实现了这个:
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</ListView.ItemContainerStyle>
也适用于TreeViewItem。在视图模型中:
protected bool _DisableSelection;
private bool _IsSelected;
public bool IsSelected
{
get { return _IsSelected; }
set
{
if (value == _IsSelected) return;
_IsSelected = _DisableSelection ? false : value;
NotifyPropertyChanged();
}
}
现在你不必去打猎了!
答案 2 :(得分:2)
这对我有用(基于this答案,但没有与项目相关 - 选择被禁用):
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="Focusable" Value="False" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
答案 3 :(得分:1)
我决定写一个可重复使用的行为,HTH:
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
用法:
<Window xmlns:components="clr-namespace:WpfApplication.Components">
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter
Property="components:TreeViewBehavior.IsTransparent"
Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
</Window>
答案 4 :(得分:1)
我刚刚选中TreeViewItems时取消选择它。 我只使用TreeView一次。但是,如果我添加了几个,我会考虑将其添加到攻击行为中。
的Xaml:
<TreeView SelectedItemChanged="TreeView_SelectionChanged">
代码背后:
private void TreeView_SelectionChanged(object sender, RoutedEventArgs e)
{
var myTreeView = sender as TreeView;
if (myTreeView == null) return;
var selectedItem = (TreeViewItem)myTreeView.SelectedItem;
if (selectedItem ==null) return;
selectedItem.IsSelected = false;
}
答案 5 :(得分:1)
我尝试了这个,对我有用。因为我有一个简单而不动态的Treeview。但是我认为将其放在样式中可以起作用
<TreeViewItem ... Focusable="False" IsSelected="False"/>
答案 6 :(得分:0)
每当选择一个项目时,您都可以“取消选择”它。防爆。从http://www.codeproject.com/KB/WPF/TreeView_SelectionWPF.aspx修改代码或使用MVVM方法(参见http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx)并始终将IsSelected设置为false。
答案 7 :(得分:0)
我这样做的方式与接受的答案不同:
让我们说你的ViewModel中有一个属性(比如说'ShouldPreventSelection') 现在当ShouldPreventSelection为true时,您希望禁用选择:
在TreeView中触发PreviewSelected事件,如下所示:
<TreeView Name="TreeView1"
...
PreviewSelected="TreeView1_PreviewSelected"
..
/>
然后在代码隐藏中,您可以执行以下操作:
private void TreeView1_PreviewSelected(object sender, RoutedEventArgs e)
{
MyViewModel myViewModel = TreeView1.DataContext as MyViewModel;
if (myViewModel == null)
{
return;
}
if (myViewModel .ShouldPreventSelection)
{
e.Handled = true;
}
}