2011-01-18 8 views
0

Это относится к MVVM & WPF - отображение динамической всплывающей подсказки на основе местоположения мыши на WPF Treeviewitems. Скажем, когда пользователь наводил верх над узлом, который получил некоторые бизнес-данные на основе этого, он должен отображать всплывающую подсказку.WPF Treeview tooltip - dynamic

Пример: скажем, если я нахожусь над деталями менеджера ... скажу - «заблокирован», а для других «готов к редактированию» и т. Д. Зависит от мыши над данными о деталях. Текст tooltip должен указывать пользователю на дальнейшие действия. Я пытаюсь выполнить некоторую настройку VM текста всплывающей подсказки с помощью события открытия всплывающей подсказки TreeViewitem и попытки обновить текст всплывающей подсказки .. но столкнувшись с какой-то проблемой.

Что все это лучший и простой способ сделать это. Пробное поведение и в конечном итоге с некоторой ошибкой.

System.Windows.Markup.XamlParseException occurred 
    Message="Cannot add content of type 'x.x.Views.CustomTreeView.TreeTooltipBehavior' to an object of type 'System.Windows.Interactivity.BehaviorCollection'. Error at object 'x.x.x.Views.CustomTreeView.TreeTooltipBehavior' in markup file 'x.x.x.Views;component/mypage.xaml' Line 72 Position 53." 
    Source="PresentationFramework" 

Код:

<MyMyControls:ExtendedTreeView x:Name="MyTreeView" ItemsSource="{Binding MyDriveCollection}" 
      ItemContainerStyle="{StaticResource TVStyleTemplate}"> 
      <MyMyControls:ExtendedTreeView.ItemTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type NavModel:TreeDataItem}" ItemsSource="{Binding MyDriveCollection}"> 
        <MyControls:SimpleEditableTextBlock x:Name="TabLabel" Text="{Binding Path=MenuText, Mode=TwoWay}" 
          ToolTip="{Binding MenuText,Mode=TwoWay}"> 
        </MyControls:SimpleEditableTextBlock> 
       </HierarchicalDataTemplate> 
      </MyControls:ExtendedTreeView.ItemTemplate> 
      <MyControls:ExtendedTreeView.ContextMenu> 
       <ContextMenu ItemsSource="{Binding ContextMenuItems}"> 
        <ContextMenu.ItemTemplate> 
         <DataTemplate> 
          <MenuItem Header="{Binding MenuText}" 
             CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, 
             AncestorType={x:Type TreeView}},Path=SelectedItem}" Command="{Binding Command}"> 
          </MenuItem> 
         </DataTemplate> 
        </ContextMenu.ItemTemplate> 
       </ContextMenu> 
      </MyControls:ExtendedTreeView.ContextMenu> 
      <i:Interaction.Behaviors> 
       <CustomTreeView:TreeTooltipBehavior CustomTreeView:ToolTipOpeningCommand="{Binding ToolTipOpeningCommand,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}" /> 
       <CustomTreeView:WorkspaceTreeViewContextMenuBehavior ContextMenuOpeningCommand="{Binding ContextMenuOpeningCommand}"/> 
      </i:Interaction.Behaviors> 
</MyControls:ExtendedTreeView> 

TreeTooltipBehavior.cs

public class TreeTooltipBehavior : Behavior<ExtendedTreeViewItem> 
    { 
     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      this.AssociatedObject.ToolTipOpening += new ToolTipEventHandler(AssociatedObject_ToolTipOpening); 
     } 

     void AssociatedObject_ToolTipOpening(object sender, ToolTipEventArgs e) 
     { 
      if (sender != null) 
      { 
       TreeDataItem hit = ((TreeDataItem) (((FrameworkElement) (sender)).DataContext)); 

       if (ToolTipOpeningCommand != null) 
       { 
        ToolTipOpeningCommand.Execute(hit); 
       } 
      } 
     } 

     public static readonly DependencyProperty ToolTipOpeningCommandProperty = DependencyProperty.Register(
      "ToolTipOpeningCommand", 
      typeof(ICommand), 
      typeof(TreeTooltipBehavior), 
      new PropertyMetadata(null)); 

     public ICommand ToolTipOpeningCommand 
     { 
      get { return (ICommand)GetValue(ToolTipOpeningCommandProperty); } 
      set { SetValue(ToolTipOpeningCommandProperty, value); } 
     } 

    } 

На мой взгляд, модель Я ожидаю, чтобы справиться с ToolTipOpeningCommand и объявил достаточно, чтобы получить событие через класс поведения.

интересно поведение ContextMenu работает нормально, но поведение подсказке бросает исключение XAML парсер ..

1) Могу ли я определить в нужном месте (за поведение)? 2) Если поведение Contextmenu работает, то почему бы не tooltipbehavior? 3) Любой ключ от исключения, вставленного вверху?

Я ожидаю, (Xaml) -tooltip behavior -> вызвать событие tooltipopening в классе поведения ->, который поочередно вызывает команду, определенную в ViewModel. Я попробовал аналогичный путь для контекстного меню и отлично работает.

Pls предлагает некоторые подсказки об устранении этой проблемы.

ответ

0

Ошибка анализатора XAML заключается в том, что вы пытаетесь подключить Behavior, который относится только к ExtendedTreeViewItem к элементу ExtendedTreeView. Другими словами, если вы измените Behavior<ExtendedTreeViewItem> на Behavior<ExtendedTreeView>, вы исправите ошибку синтаксического анализа.

Хотя мы не можем видеть из кода, представленного, причина, по которой ContextMenu работает, вероятно, потому, что WorkspaceTreeViewContextMenuBehavior происходит от Behavior с параметром универсального типа, который совместим с ExtendedTreeView, такой как FrameworkElement.

+0

Спасибо, rick за ваше время, проходя через мою проблему. Проблема сейчас решена с помощью стиля ... но не знаю, почему я не могу прикрепить behvior для команды Treeviewitem tooltipopening. – Maheshk