禁用WPF TreeView(或TreeViewItem)选择?

时间:2010-12-29 12:59:18

标签: wpf xaml treeview selection itemscontrol

是否有一种不错的方法(除了重新模拟整个TreeViewItem.Template)以禁用TreeView中的选择?

我基本上在寻找ItemsControl TreeView的{​​{1}}风格(ItemsControl ListBox最适合{禁用'{{1}}上的选择,请阅读{{3} } post)

8 个答案:

答案 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;
    }

}
相关问题