2017-03-24 37 views
0
<TreeView x:Name="TestTree" 
        ItemsSource="{Binding Children}" 
        ItemTemplateSelector="{StaticResource TemplateSelector}" > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="TreeViewItem.Seleted"> 
      <i:InvokeCommandAction 
         Command="{Binding SelectedCommand}" 
         CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</TreeView> 

上記のコードでは、ビューから選択されたtreeviewitemデータを取得したいのですが、添付イベント(メンバーイベントはOK)のバインディングイベントTreeViewItem.Seletedはビューモデルでは受信できません。添付されたイベントをviewmodelにバインドする方法は?WPF添付されたイベントをviewmodelにバインドする方法は?

+0

は確かですあなたたいが添付イベントとは 'SelectedItemChanged'ではなく 'Seleted'ですか? –

+0

typo Seleted ==> Selected;これはプロパティです – GCamel

+0

@Mighty Badaboomうん、SelectedItemChangedはバインドできますが、選択したアイテムデータが必要なものになりません。 –

答えて

0

TreeviewItemイベントがTreeViewに表示されません。カスタムアイテムテンプレートが必要です。私は、そう私はあなたが

<i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectedItemChanged" > 
       <command:EventToCommand Command="{Binding Path=SelectionChangedCommand}" PassEventArgsToCommand="True" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
+0

ありがとう、私はそれを試してみましょう... –

0

が理由だけではなく、昔ながらのEventHandlerを使用していないしなければならないと思いますMVVMLightとデータグリッド(ただし、項目)でこの

</DataGrid.Columns> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="MouseDoubleClick" > 
          <command:EventToCommand Command="{Binding Path=OpenEquipementCommand}" PassEventArgsToCommand="True"/> 
         </i:EventTrigger> 

         <i:EventTrigger EventName="SelectionChanged"> 
          <command:EventToCommand Command="{Binding Path=SelectionChangedCommand}" PassEventArgsToCommand="True" /> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 

       </DataGrid> 

のようにそれを行いますか? WPFのサポートが結合という理由だけで

public partial class MainWindow : Window 
{ 
    MainWindowViewModel ViewModel => (MainWindowViewModel) DataContext; 

    private void TreeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     var element = (FrameworkElement)sender; 
     var item = element.DataContext; 
     ViewModel.SelectionChangedCommand.Invoke(item); 

     //alternativelly: 
     ViewModel.SelectedItem = TreeView1.SelectedItem; 
    } 
} 

<TreeView x:Name="TreeView1" SelectedItemChanged="TreeView_SelectedItemChanged" /> 

、それはあなたが、それは非常に複雑だ場合でも、どこでもそれを使用する必要が意味するものではありません。私が書いたコードは、MVVMの違反ではありません。

あなたが背後にあるコードを避けるために正当な理由がある場合は、添付プロパティとして実装カスタム動作でのこのイベントハンドラを実装することができるので、それは次のようになります。

<TreeView local:TreeViewBehavior.SelectionChangedCommand="{Binding SelectionChangedCommand}" /> 
関連する問題