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



我是WPF的新手,并且对现有代码感到痛苦。

我们有一棵树,它有很多树枝/叶子。在一个分支中,我们有一个数据网格。

如果我们单击网格的空白区域(没有行),则正确调用TreeView.SelectedItemChanged。在我们的例子中,SelectedItem = 'SelectedGridBorder' (请参阅下面的 XAML)

但是,如果我们单击网格的行/单元格,行将获得焦点,但不会调用TreeView.SelectedItemChanged。因此,TreeView.SelectedItem 仍然是以前选择的项目。是可以实现这种(根据我的说法)逻辑行为的,所以当单击一行时,应该自动调用TreeView.SelectedItemChanged,而TreeView.SelectedItem应该是"SelectedGridBorder",就像单击没有行的网格区域一样。

为什么"选定项已更改"单击网格行或单击没有行的网格不同?

谢谢。

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>

答案

为什么"选定项已更改"单击网格行或单击没有行的网格不同?

鼠标按下是一个冒泡的事件。 正在发生的事情是,DataGrid 的文本框将事件标记为已处理,因此它永远不会到达 TreeViewItem (WPF 会自动创建 TreeViewItem,即使你没有专门将其包含在标记中)。 如果您单击标题或行选择器,他们不会将事件标记为已处理。

获得您期望的行为

//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;
    }

相关内容

  • 没有找到相关文章

最新更新