WPF:单击TreeView中的DataGrid行不会触发TreeView.SelectedItemChanged

时间:2016-06-10 07:43:18

标签: wpf datagrid treeview selecteditem selecteditemchanged

我是WPF的新手,并且受到现有代码的影响。

我们有一棵树,有许多树枝/树叶。在一个分支中,我们有一个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>

1 个答案:

答案 0 :(得分:0)

答案

  

为什么选择

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

The Handler

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