2010-12-29 1 views
3

Есть ли хороший способ (кроме повторного заполнения всего TreeViewItem.Template), чтобы отключить выбор в TreeView?Отключить выбор WPF TreeView (или TreeViewItem)?

Я в основном ищу ItemsControl стиль TreeView (An ItemsControl лучше использовать для «отключения» выбора на ListBox, прочитать this пост)

+0

Вот еще один подход: http: // stackoverflow.com/questions/1398559/there-aint-listbox-selectionmode-none-is-there-another-way-to-disable-selecti/1398625 # 1398625/1228 – Will

ответ

0

Всякий раз, когда выбран элемент, вы может «отменить» его. Ex. измените код с http://www.codeproject.com/KB/WPF/TreeView_SelectionWPF.aspx или используйте подход MVVM (см. http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx) и всегда возвращайте значение IsSelected в значение false.

+2

Хотя это теоретически может ответить на этот вопрос, мы хотели бы, чтобы вы включили основные части связанной статьи в вашем ответе и предоставите ссылку [ссылка для справки] (http://meta.stackexchange.com/q/8259). Если это не удастся, это даст ответ на риск от гниения. – Kev

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

Я сделал это по-другому, чем принято отвечать:

позволяет сказать, что у вас есть собственность в вашей ViewModel (скажем, «ShouldPreventSelection») Теперь, когда ShouldPreventSelection это правда, что вы хотите, выбор должен быть отключен:

в вашем 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; 
    } 

} 
+5

Событие 'PreviewSelected' в WPF' TreeView', похоже, не существует. – svick

+0

hmm Я использовал RadTreeView от Telerik, и я предполагаю, что предположил, что событие PreviewSelected доступно в обычном TreeView. – Danield

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(); 
    } 
} 

Теперь вам не обязательно идти на охоту!

14

Попробуйте это:

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

Чтобы продлить этот ответ, установка Фокусировка на значение false на листе TreeViewItems также не позволяет их выбрать. – ravuya

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

Это сделал трюк для меня (на основе this ответа, но не привязан к пункту - выбор отключен вообще):

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

 Смежные вопросы

  • Нет связанных вопросов^_^