2011-01-18 52 views
0

これは、MVVM &に関連しています。WPF - WPF TreeviewItemsのマウスの位置に基づいた動的なツールチップを表示します。たとえば、ユーザーがツールチップを表示する必要があることに基づいてビジネスデータを持っているノードを移動したとしましょう。WPF Treeviewツールチップ - 動的

例:マネージャーアイテムにカーソルを合わせると、「ロックされています」と他の人には「編集可能」などと表示されます。アイテム上のマウスのデータに依存します。ツールヒントのテキストは、ユーザにさらなるアクションを促すべきです。私はTreeViewItemのイベントを開くツールチップの助けを借りていくつかの問題に直面しているツールチップのテキストを更新しようとすると、ツールチップテキストのいくつかのVM設定をしようとしています。

これを行うための最も簡単で簡単な方法は何ですか?試行された動作といくつかのエラーで終了します。

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を処理するために期待して取得するのに十分と宣言していますBehaviorクラスを介してイベント。

興味深いことにコンテキストメニューの動作が正常に動作しますが、ツールチップの動作は、XAMLパーサー例外がスローされます。..

1は、i)は、()の動作のための右の場所で定義されているだろうか? 2)Contextmenuの動作が機能する場合、tooltipbehaviorはなぜですか? 3)上部にペーストされた例外の手掛かりはありますか?

(Xaml)-tooltipビヘイビア - (ビヘイビアクラス)のtooltipopeningイベントを呼び出す - > ViewModelで定義されたコマンドを呼び出します。私はコンテキストメニューのこの同様の方法を試して、うまく動作します。

Plsはこの問題を修正するためのヒントを提供します。

答えて

0

XAMLパーサーエラーは、ExtendedTreeViewItemにのみ適用されるBehaviorExtendedTreeView要素に添付しようとしているためです。つまり、Behavior<ExtendedTreeViewItem>Behavior<ExtendedTreeView>に変更すると、解析エラーが修正されます。

私たちは、あなたが提示したコードから見ることはできませんがWorkspaceTreeViewContextMenuBehaviorは、FrameworkElementとして、ExtendedTreeViewと互換性のあるジェネリック型パラメータでBehaviorから派生しているため、その理由ContextMenu作品は、おそらくです。

+0

問題を解決するためのお時間をいただきありがとうございます。問題は今、スタイルで解決されています...しかし、なぜ私はTreeviewitem tooltipopeningコマンドのためにbehviorを添付することができません。 – Maheshk