2016-06-10 5 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/questions/6586488/wpf-treeview-selecteditemchanged-not-firing. 어떻게 해결 했습니까 : Grid_GotFocus'에서'(VisualHelper.GetAncestorByType (DependencyObject, typeof (TreeViewItem)로 TreeViewItem)를 TreeViewItem으로 호출) .IsSelected = true;'그리드가 없으므로 어떻게 작동 될지 궁금 해서요. 직접 TreeViewItem Ancestor,하지만 디버깅, 그리고 그것을했다 -하지만 당신은 분명히 (WPF 그것을 자동으로 만듭니다). 감사! – Zotyi