2010-12-19 4 views
2

私は標準のWPFツリービューを持ち、モデルクラスを表示するための項目をバインドしています。WPFでは、MVVMはViewModelをウィンドウのオープンに関与させるべきです。 About-ウィンドウ?

これで、アイテムをダブルクリックしたときのビヘイビア(ビジュアルスタジオスタイルのドキュメントを開く)を処理したいと考えています。

ツリービュー(xamlが表示されます)を含むコントロールでイベントハンドラを起動できますが、ビューモデルクラスの特定の動作にバインドするにはどうすればいいですか? ProjectViewModel?

これは他の場所で使用されているとして、ICommandの-実装にバインド好ましい...任意のコメント

おかげで、

アンダース、デンマーク

<TreeView ItemsSource="{Binding Projects}" MouseDoubleClick="TreeView_MouseDoubleClick"> 
     <TreeView.ItemContainerStyle> 
      <!-- 
    This Style binds a TreeViewItem to a TreeViewItemViewModel. 
    --> 
      <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.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type Implementations:ProjectViewModel}" ItemsSource="{Binding Children}"> 
       <StackPanel Orientation="Horizontal"> 
        <Image Width="16" Height="16" Margin="3,0" Source="Images\Region.png" /> 
        <TextBlock Text="{Binding DisplayName}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 

      <HierarchicalDataTemplate DataType="{x:Type Implementations:PumpViewModel}" ItemsSource="{Binding Children}"> 
       <StackPanel Orientation="Horizontal"> 
        <Image Width="16" Height="16" Margin="3,0" Source="Images\State.png" /> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
      </HierarchicalDataTemplate> 

      <DataTemplate DataType="{x:Type Implementations:PumpDesignViewModel}"> 
       <StackPanel Orientation="Horizontal"> 
        <Image Width="16" Height="16" Margin="3,0" Source="Images\City.png" /> 
        <TextBlock Text="{Binding Name}" /> 
       </StackPanel> 
      </DataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

答えて

2

タイトル-の質問には:はい。メインビューのVMはAboutBoxを表示する必要があります。

メッセージの本文が違って見えるかもしれませんが、多分それを少し拡大できますか?

+0

申し訳ありません - 2つの質問が混在しています。 –

+0

'body'の質問について: 私は、表示、遅延ロードなどに関して個々のツリーアイテムを扱うviewmodelオブジェクトを持っています。 しかし、ツリービュー内の項目を「アクティブ化」/ダブルクリックしたいときは、私は、このアクションをディスプレイを扱う同じビューモデルオブジェクトで処理することを希望しますが、どうすればよいですか? –

+0

タイトルの質問に答えたので、これを回答としてマークしました。 'body'の質問はこちら[こちら](http://stackoverflow.com/questions/4497825/wpf-mvvm-how-to-handle-double-click-on-treeviewitems-in-the-viewmodel)に転載されています。申し訳ありませんがinconveneince(ハード単語;-)) –

0

これを行うには、既に言及したようにコマンドパターンを使用するのが好ましい方法です。 I.依存関係プロパティを介してICommand実装にバインドする

依存関係のプロパティは、フレームワークが使用する依存関係のものを実装する静的なバッキングプロパティによって実際に実装されます。

残念ながら、MSがバッキングプロパティを実装することを決めた方法は、 - 少なくとも、最適なものではありません。

それは、XAMLでにバインド公共、非静的プロパティにフックアップされた - ハードコードされた文字列によって...

私はどこ覚えていないが、私はと非常にエレガントな解決策を見つけました静的/非静的関係でラムダ式を使用してマッピングを行い、ハードコーディングされたエラーが発生しやすい文字列マッピングを完全に削除します。

これがまだ必要な場合は、これに関する詳細をお送りください。あなたが私に連絡する場所を知っています:-)

また、検査する必要があるもう一つの懸念は、テスト容易性を維持するためにビューの実装を抽象化することです。

+1

こんにちはTorben、あなたのコメントを追加していただきありがとうございます!あなたが指摘しているように、XAMLの文字列リテラルを使ってマッピングが行われても、今は満足のいく解決策があると思います。私はいくつかのファンシーなラムダ式を使ったマッピングからの複雑さがそれほど価値がないと思う。前にこの議論があったのですか?-)?それでも、ありがとう、すぐにお会いしましょう。 –

関連する問題