2016-06-10 92 views
0

我是WPF的新手,并且遇到了现有的代码。WPF:单击TreeView内的DataGrid行不会触发TreeView.SelectedItemChanged

我们有一棵树,里面有许多树枝/树叶。在一个分支中,我们有一个DataGrid。

如果我们点击网格的空白区域(没有行),然后调用TreeView.SelectedItemChanged。在我们的例子中,SelectedItem ='SelectedGridBorder'(见下面的XAML)

但是,如果我们点击网格的一行/单元格,那么行会被聚焦,但TreeView.SelectedItemChanged不会被调用。 因此,TreeView.SelectedItem仍然是之前选择的项目。 是可以实现这个(根据我)的逻辑行为,所以当点击一行时,应该自动调用TreeView.SelectedItemChanged,并且TreeView.SelectedItem应该是'SelectedGridBorder',就像点击没有行的网格区域是。

为什么'SelectedItemChanged'点击网格行或点击没有行的网格会有所不同?

谢谢。

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> 

回答

0

答案

为什么它“SelectedItemChanged”不同的点击网格行,或者点击一个网格,没有行是谁?

MouseDown是一个冒泡事件。发生了什么事情是你的DataGrid的TextBox将事件标记为已处理,所以它永远不会到达TreeViewItem(WPF自动创建TreeViewItem,即使你没有专门将它包含在标记中)。如果您单击了Header或RowSelector,它们不会将事件标记为已处理。

为了得到您所期望

//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"> 

处理程序的行为

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

感谢您的意见,在此同时,我也定了,这个其他Q帮我:HTTP://计算器.COM /问题/ 6586488/WPF的树视图 - selecteditemchanged - 不烧。我在Grid_GotFocus中调用'(VisualHelper.GetAncestorByType(e.Source作为DependencyObject,typeof(TreeViewItem))作为TreeViewItem).IsSelect = true;'我想知道它是如何工作的,因为grid不是直接TreeViewItem祖先,但我调试,它有 - 但你已经明确(WPF自动创建它)。谢谢! – Zotyi