2013-07-07 3 views
0

В моем приложении WPF я добавил данные TreeView для привязки элемента управления TreeViewItems. Я добавил контекстное меню в treeviewitems. Обработчик контекстаMenu не стреляет. Вот код XAML для TreeView.Триггер контекстного меню не запускается в TreeViewItem

<TreeView ItemsSource="{Binding pads}" Width="190"> 
        <TreeView.ItemContainerStyle> 
         <Style TargetType="{x:Type TreeViewItem}"> 
          <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
          <Setter Property="FontWeight" Value="Normal" /> 
          <Setter Property="ContextMenu"> 
           <Setter.Value> 
            <ContextMenu> 
             <MenuItem Header="Rename" Command="{Binding RenameCommand}"/> 
            </ContextMenu> 
           </Setter.Value> 
          </Setter> 
          <Style.Triggers> 
           <Trigger Property="IsSelected" Value="True"> 
            <Setter Property="FontWeight" Value="Bold" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </TreeView.ItemContainerStyle> 

        <TreeView.ItemTemplate> 
         <HierarchicalDataTemplate ItemsSource="{Binding Members}"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Name}" /> 
           <TextBlock Text=" [" Foreground="Blue" /> 
           <TextBlock Text="{Binding Members.Count}" Foreground="Blue" /> 
           <TextBlock Text="]" Foreground="Blue" /> 
          </StackPanel> 
          <HierarchicalDataTemplate.ItemTemplate> 
           <DataTemplate DataType="{x:Type vm:PadInfo}"> 
            <StackPanel Orientation="Horizontal"> 
             <TextBlock Text="["></TextBlock> 
             <TextBlock Text="{Binding SlotID}" /> 
             <TextBlock Text="] ["></TextBlock> 
             <TextBlock Text="{Binding WellID}" /> 
             <TextBlock Text="]"></TextBlock> 
            </StackPanel> 
           </DataTemplate> 
          </HierarchicalDataTemplate.ItemTemplate> 
         </HierarchicalDataTemplate> 
        </TreeView.ItemTemplate> 

       </TreeView> 

Это два класса, привязанные к TreeView.

/// <summary> 
/// Class to hold the Pads info for a tree 
/// </summary> 
public class Pad 
{ 
    /// <summary> 
    /// Default Constructor 
    /// </summary> 
    public Pad() 
    { 
     this.Members = new ObservableCollection<PadInfo>(); 
    } 

    /// <summary> 
    /// Name of the pad 
    /// </summary> 
    public string Name { get; set; } 

    /// <summary> 
    /// Members of the pad 
    /// </summary> 
    public ObservableCollection<PadInfo> Members { get; set; } 
} 

/// <summary> 
/// Class to hold the well and slot IDs snapped to a pad 
/// </summary> 
public class PadInfo 
{ 
    /// <summary> 
    /// Slot ID 
    /// </summary> 
    public string SlotID { get; set; } 

    /// <summary> 
    /// Well ID 
    /// </summary> 
    public string WellID { get; set; } 
} 

}

Этот элемент связывается с TreeView

public List<Pad> pads { get; set; } 

Когда я правой кнопкой мыши на пункты меню, событие RenameCommand не стреляли. Когда я меняю обработчик, он запускается, но TreeView не заполняется привязанными данными.

Пожалуйста, помогите. Thanks

ответ

0

В принципе, мне не хватает важного кода здесь, где находится ваш класс со списком, с какой командой вы связываетесь? Кроме того, вы используете CommandBinding. Это не похоже на обычный обработчик событий. Это две вещи в WPF. Я думаю, что вам не хватает Свойство для вашей команды в вашем классе DataContext.

+0

Когда я использую TreeViewItem вместо TreeView.ItemTemplate, запускается одна и та же команда. Поэтому я не думаю, что проблема связана с Command или DataContext. Когда я это делаю и нажмите F2, , – WAQ

+0

Это не зависит от шаблона treeviewitem /. Разница между командами и событиями заключается в том, что с событием в WPF (или другом) вы определяете метод, который выполняется. С привязкой Command у вас есть свойство. И это свойство содержит действие, которое должно быть выполнено. Но здесь этот код отсутствует. – Tintenfiisch

+0

вот мой обработчик команд private ICommand _RenameCommand; общественного ICommand RenameCommand { получить { если (_RenameCommand == NULL) { _RenameCommand = новый RelayCommand1 ((о) => {MessageBox.Show ("Переименовать меня");}); } return _RenameCommand; } } – WAQ

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