2013-08-08 6 views
1

Я использую дерево TreeView WPF, когда я нажимаю на узел \ item после его выбора. Когда пользователь нажимает на выбранный узел во второй раз, я хочу, чтобы этот узел \ item не был отменен, то есть я должен получить событие. IsSelected не вызывается, если я нажимаю на выбранный узел \ item, который уже выбран. Как я могу заставить его работать?Удалить выбранный элемент в дереве wpf (MVVM)

<TreeView Grid.Column="0" Grid.Row="1" ItemsSource="{Binding source}" Name="mytreeview"> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
       <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
       <Setter Property="FontWeight" Value="Normal" /> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TreeView.ItemContainerStyle> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
       <TextBlock Text="{Binding displaytext}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

и в моей модели представления у меня есть

public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      if (value != _isSelected) 
      { 
       _isSelected = value; 
       if (_isSelected) 
       { 
        //my logic 
       } 

       this.OnPropertyChanged("IsSelected"); 
      } 
     } 
    } 

ответ

-1

Свойство IsSelected изменяется только при выборе нового элемента. Нажатие на один и тот же элемент дважды не будет иметь никакого эффекта. Вам нужно будет зарегистрировать событие MouseDown в TreeView, а затем принудительно отключить элемент в коде.

+0

Я добавил флажок для каждой строки и с помощью команд – Kaddy

0
if (value != _isSelected) 

Предполагая, что пользовательский интерфейс даже пытается установить что-то, что линия блокирует переключения логики. Что-то вроде этого должно исправить хотя бы эту часть.

set 
    { 
     if (value != _isSelected) 
     { 
      _isSelected = value; 
      this.OnPropertyChanged("IsSelected"); 
     } 
     else if(_isSelected) 
     { 
      IsSelected = false; 
     } 
    } 

В противном случае интерфейс проверяет выбор перед установкой значения, и вы должны будете обрабатывать его через какое-либо другое взаимодействие с пользователем, как обработка на отмену выбора щелчка мыши.

0

Я знаю, что это немного поздно, но у меня недавно было такое же требование (то есть, не было выбора выбранного TreeViewItem во втором клике), и я решил его, объявив обработчик события для события MouseLeftButtonUp в стиле 'вход для ItemContainerStyle в TreeView следующим образом:

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <EventSetter Event="MouseLeftButtonUp" Handler="TreeViewItem_MouseLeftButtonUp"/> 
    </Style> 
</TreeView.ItemContainerStyle> 

обработчик событий в коде позади, было следующим:

private TreeViewItem prevTVI; 

private void TreeViewItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    TreeViewItem tvi = (TreeViewItem)sender; 
    if (tvi == this.prevTVI) 
    { 
     this.prevTVI = null; 
     if (tvi.IsSelected) 
      tvi.IsSelected = false; 
    } 
    else 
     this.prevTVI = tvi; 
    e.Handled = true; 
} 

Теперь я хотел бы спросить, если кто-то думает, что такой подход разрушает Модель MVVM? Я лично не думаю, что обработчик событий связан только с представлением и его объектами не что-то еще, но я хотел бы услышать, что говорят другие, особенно если у кого-то есть альтернатива.

+0

вы пишете ответ на этот вопрос или задаете новый вопрос? См. [Как ответить] (http://stackoverflow.com/help/how-to-answer) вопросы о SO. – techspider

+0

@techspider - это ответ на проблему, и мне это очень понравилось, но мне было интересно узнать, что другие люди думают об этом по отношению к шаблону проектирования MVVM. – RobDev

+0

Возможно, вам придется опубликовать его как новый вопрос, вопрос является ссылкой. Пожалуйста, обратитесь к [этой статье о том, как написать хороший ответ на SO] (http://stackoverflow.com/help/how-to-answer) – techspider

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