2012-03-21 17 views
0

私はツリービューコントロールで2つのビューを持っています。どちらのXAMLファイルでも、ダブルクリックイベントを追加しました。ツリービューのダブルクリックイベント

<TreeView x:Name="tvTest" ItemsSource="{Binding}" Style="{StaticResource TreeviewStyle}" MouseDoubleClick="tvTest_MouseDoubleClick"> 

イベントハンドラはビューコードビハインドで生成されます。私は、これが最もエレガントな方法ではないかもしれないけど、ツリービューがコマンドオブジェクトを欠いているように私は今のところ、これに固執する:

Public Sub tvTest_MouseDoubleClick(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs) 

End Sub 

最初のビューでは、これは正しい動作しますが、2番目のビューは、私は、このエラーを与えます:
* tvTest_MouseDoubleClickはMySecondViewのメンバーではありません。*

これはなぜですか?エラーは、デザイナ生成されたコードで発生:

AddHandler Me.tvTest.MouseDoubleClick, New System.Windows.Input.MouseButtonEventHandler(AddressOf Me.tvTest_MouseDoubleClick) 

よろしく、

ミシェル

EDIT:アレックス」溶液に投票
。しかし、一般的に物事を修正するにはhttp://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/

+0

「ツリービューコントロールで2つのビューを持っています」とはどういう意味ですか?私は 'TreeView'のための単一のコードスニペットと2つではありません。 –

+0

つまり、私はほぼ同じツリービューxaml(他の命名法)で2つのビューを持っていることを意味します。そのため、私はコードに2つのスニペットを入れませんでした。 –

答えて

1

2番目のビューにはイベントハンドラがないようです(このため、コードを使用することはお勧めしません)。

あなたは、TreeViewにはダブルクリックコマンドがありませんが、私たち自身のためにツリービューを作成するのを止めることはできません。

ここで私はちょうどあなたのツリービューのItemTemplateににコマンドとCommandParameter(オプション)を設定し、あなたのTreeViewItemsのためにそれを使用するには任意のフレームワーク要素に

public class DoubleClickCommand 
    { 
     public static object GetDoubleClickParameter(DependencyObject obj) 
     { 
      return (object)obj.GetValue(DoubleClickParameterProperty); 
     } 

     public static void SetDoubleClickParameter(DependencyObject obj, object value) 
     { 
      obj.SetValue(DoubleClickParameterProperty, value); 
     } 

     public static ICommand GetDoubleClickCommand(DependencyObject obj) 
     { 
      return (ICommand)obj.GetValue(DoubleClickCommandProperty); 
     } 

     public static void SetDoubleClickCommand(DependencyObject obj, ICommand value) 
     { 
      obj.SetValue(DoubleClickCommandProperty, value); 
     } 


     public static readonly DependencyProperty DoubleClickParameterProperty = DependencyProperty.RegisterAttached("DoubleClickParameter", typeof(object), typeof(DoubleClickCommand), new UIPropertyMetadata(null)); 

     public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.RegisterAttached("DoubleClickCommand", typeof(ICommand), typeof(DoubleClickCommand), new UIPropertyMetadata(null, OnDoubleClickCommandChanged)); 


     private static void OnDoubleClickCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) 
     { 
      FrameworkElement elem = d as FrameworkElement; 
      var newCommand = args.NewValue as ICommand; 
      if (elem != null) 
      { 
       if (newCommand != null) 
       { 
        elem.MouseLeftButtonDown += elem_MouseLeftButtonDown; 
       } 
       else 
       { 
        elem.MouseLeftButtonDown -= elem_MouseLeftButtonDown; 
       } 
      } 
     } 

     private static void elem_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      if (e.ClickCount > 1) 
      { 
       DependencyObject dep = sender as DependencyObject; 
       ICommand command = GetDoubleClickCommand(dep) as ICommand; 
       var parameter = GetDoubleClickParameter(dep); 
       if (command != null) 
       { 
        if (command.CanExecute(parameter)) 
        { 
         command.Execute(parameter); 
        } 
       } 
      } 
     } 
    } 

をDoubleClickCommandを公開するために書いた基本的なクラスです。

+0

非常に面白いAlexDrenea。コードをvb.netに変換して試してみましょう。 –

+0

* typeof(Behaviors)*はtypeof(DoubleClickCommand)*でなければなりません。 –

+0

はい、申し訳ありませんが、クラスをBehaviorsから名前を変更し、プロパティの変更を忘れました...更新されます。 – AlexDrenea

関連する問題