2010-12-29 13 views
3

Gibt es einen schönen Weg (außer das ganze TreeViewItem.Template retickling) um die Auswahl in TreeView zu deaktivieren?Deaktivieren WPF TreeView (oder TreeViewItem) Auswahl?

ich im Grunde bin für den ItemsControl Stil der TreeView (An ItemsControl ist die beste Verwendung zu ‚deaktivieren‘ Auswahl auf ListBox, las this post)

+0

Hier ist ein anderer Ansatz: http: // stackoverflow.com/Fragen/1398559/es-aint-listbox-selection-keine-ist-es-another-way-to-disable-selecti/1398625 # 1398625/1228 – Will

Antwort

0

Jedes Mal, wenn ein Element ausgewählt ist, können Sie könnte es "abwählen". Ex. Ändern Sie den Code von http://www.codeproject.com/KB/WPF/TreeView_SelectionWPF.aspx, oder verwenden Sie einen MVVM-Ansatz (siehe http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx), und setzen Sie IsSelected immer auf false zurück.

+2

Während dies theoretisch die Frage beantworten können, möchten wir Sie schließen die wesentlichen Teile des verknüpften Artikels in Ihrer Antwort, und stellen Sie den [Verweis zur Referenz] (http://meta.stackexchange.com/q/8259). Wenn dies nicht geschieht, bleibt die Antwort durch Link-Fäulnis gefährdet. – Kev

1

ich ein wiederverwendbares Verhalten schreiben entschieden, 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 

Verbrauch:

<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> 
0

Ich tat dies ein anders als die akzeptierte Antwort:

Lassen Sie uns sagen, dass Sie eine Eigenschaft in Ihrem Ansichtsmodell haben (sagen ‚ShouldPreventSelection‘) Nun, wenn ShouldPreventSelection wahr ist, dass Sie Auswahl deaktiviert werden soll:

in Ihrem TreeView Brandereignis die PreviewSelected wie so:

<TreeView Name="TreeView1" 
    ... 
    PreviewSelected="TreeView1_PreviewSelected" 
    .. 
/> 

Dann in der Code-Behind können Sie folgendes:

private void TreeView1_PreviewSelected(object sender, RoutedEventArgs e) 
{ 
    MyViewModel myViewModel = TreeView1.DataContext as MyViewModel; 
    if (myViewModel == null) 
    { 
     return; 
    } 
    if (myViewModel .ShouldPreventSelection) 
    { 
     e.Handled = true; 
    } 

} 
+5

Es scheint kein "PreviewSelected" -Ereignis auf dem WPF "TreeView" zu geben. – svick

+0

hmm ich wurde mit Telerik RadTreeView und ich denke, dass ich, dass das PreviewSelected Ereignis in einem regelmäßigen TreeView vorhanden war angenommen. – Danield

3

Basierend aus den Links auf die derzeit akzeptierte Antwort, ich implementiert dies in meinem Projekt:

<ListView.ItemContainerStyle> 
    <Style TargetType="{x:Type ListViewItem}"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
    </Style> 
</ListView.ItemContainerStyle> 

Werke für TreeViewItem auch. Und in der View-Modell:

protected bool _DisableSelection; 
private bool _IsSelected; 
public bool IsSelected 
{ 
    get { return _IsSelected; } 
    set 
    { 
     if (value == _IsSelected) return; 
     _IsSelected = _DisableSelection ? false : value; 
     NotifyPropertyChanged(); 
    } 
} 

Jetzt müssen Sie nicht auf die Jagd gehen!

14

Try this:

<Trigger Property="HasItems" Value="true"> 
    <Setter Property="Focusable" Value="false" /> 
</Trigger> 
+2

diese Antwort zu verlängern, erscheint Fokussierbare auf falsch auf Blatt TreeViewItems Einstellung auch um zu verhindern, ausgewählt zu werden. – ravuya

1

ich nicht ausgewählten nur die TreeViewItems wie sie ausgewählt bekommen. I Verwenden Sie die TreeView nur einmal. Wenn ich jedoch mehrere platzierte, würde ich darüber nachdenken, dies einem Angriffsverhalten hinzuzufügen.

XAML:

<TreeView SelectedItemChanged="TreeView_SelectionChanged"> 

-Code hinter:

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; 
} 
1

Das ist für mich den Trick (basierend auf this Antwort, aber kein Punkt gebunden - Auswahl ist deaktiviert auch immer):

<TreeView> 
    <TreeView.ItemContainerStyle> 
    <Style TargetType="TreeViewItem"> 
     <Setter Property="Focusable" Value="False" /> 
    </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
Verwandte Themen