2016-06-10 14 views
0

Ich bin neu in WPF und leiden mit einem vorhandenen Code.WPF: Klicken auf eine DataGrid-Zeile in einer TreeView triggert nicht TreeView.SelectedItemChanged

Wir haben einen Baum, der viele Zweige/Blätter hat. In einem Zweig haben wir ein DataGrid.

Wenn wir auf den leeren Bereich des Rasters klicken (wo keine Zeilen sind), dann wurde TreeView.SelectedItemChanged korrekt aufgerufen. In unserem Fall SelectedItem = 'SelectedGridBorder' (siehe XAML unten)

Aber wenn wir auf eine Zeile/Zelle des Rasters klicken, wird die Zeile fokussiert, aber TreeView.SelectedItemChanged wird NICHT aufgerufen. Also TreeView.SelectedItem ist immer noch das zuvor ausgewählte Element. Ist es möglich, dieses (nach mir) logische Verhalten zu erreichen, so sollte TreeView.SelectedItemChanged beim Klicken auf eine Zeile automatisch aufgerufen werden, und TreeView.SelectedItem sollte "SelectedGridBorder" sein, genau wie beim Klicken auf den Rasterbereich ohne Zeilen sind.

Warum unterscheidet sich 'SelectedItemChanged' darin, auf eine Rasterzeile zu klicken oder auf ein Raster zu klicken, in dem sich keine Zeilen befinden?

Danke.

XAML:

<TreeView x:Name="CalculationDataTree" .....> 
    <Cinch:EventCommander.Mappings> 
     <Cinch:CommandEvent  
      Command="{Binding Path=DataContext.SelectionChangeCommand .... 
        Event="SelectedItemChanged" 
        Cinch:CommandEvent.CommandParameter="{Binding ElementName=CalculationDataTree,Path=SelectedItem}"/> 
... 

    <TreeViewItem x:Name="Params" ...> 
     <TreeViewItem.Header> 
      <TextBlock>Parameters</TextBlock> 
     </TreeViewItem.Header> 

     <TreeViewItem x:Name="Dates" Margin="0,6,0,0"> 
      <TreeViewItem.Header> 
       <StackPanel Orientation="Horizontal"> 
            <TextBlock Margin="4,10">Date(s)</TextBlock> 
            <ContentControl Margin="4,6" Content="{Binding}" ContentTemplate="{StaticResource OwnEditorTemplate}" /> 
       </StackPanel> 
      </TreeViewItem.Header> 
     </TreeViewItem> 
     <Border Name="SelectedGridBorder" ... > 
      <StackPanel Orientation="Vertical"> 
       <TextBlock Margin="4,10">Other parameters</TextBlock> 
        <StackPanel Orientation="Horizontal"> 
         <DockPanel> 
          <dg:DataGrid Height="300" Width="600" Name="dataGrid" ....> 
           <dg:DataGrid.Columns> 
            ... 
           </dg:DataGrid.Columns> 

Antwort

0

Die Antwort auf

Warum ist es anders für ‚SelectedItemChanged‘ auf einer Rasterzeile klicken, oder auf einem Raster klicken, wo keine Zeilen sind?

MouseDown ist ein sprudelndes Ereignis. Was passiert, ist die TextBox Ihres DataGrids, die das Ereignis als behandelt markiert hat, so dass es TreeViewItem nie erreicht hat (WPF erstellt das TreeViewItem automatisch, obwohl Sie es nicht ausdrücklich in Ihr Markup aufgenommen haben). Wenn Sie auf einen Header oder RowSelector geklickt haben, würden sie das Ereignis nicht als behandelt markieren.

Um das Verhalten zu erhalten Sie

//WPF creates the TreeViewItem automatically if you didn't include it 
<TreeViewItem PreviewMouseDown="TreeviewItem_PreviewMouseDown"> 
    <Border Name="SelectedGridBorder" ... > 
     <StackPanel Orientation="Vertical"> 
      <TextBlock Margin="4,10">Other parameters</TextBlock> 
       <StackPanel Orientation="Horizontal"> 

der Handler

private void TreeviewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     var treeViewItem = sender as TreeViewItem; 
     treeViewItem.IsSelected = true; 
    } 
erwarteten
+0

Dank Ihren Kommentar, in der Zwischenzeit ich es auch fixiert, das andere Q half mir: http: // Stackoverflow .com/questions/6586488/wpf-treeview-selecteditemchanged-nicht-feuernd. Wie löste ich: in 'Grid_GotFocus', rufe ich' (VisualHelper.GetAncestorByType (e.Quelle als DependencyObject, typeof (TreeViewItem)) als TreeViewItem) .IsSelected = true; 'Ich fragte mich, wie es funktionieren könnte, da Grid keine hat Direct TreeViewItem Ancestor, aber ich debuggte, und es hatte - aber Sie machten es klar (WPF erstellt es automatisch). Vielen Dank! – Zotyi