【问题标题】:WPF: Clicking on a DataGrid Row inside a TreeView does not trigger TreeView.SelectedItemChangedWPF:单击 TreeView 内的 DataGrid 行不会触发 TreeView.SelectedItemChanged
【发布时间】:2016-10-11 02:13:24
【问题描述】:

我是 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>

【问题讨论】:

    标签: wpf datagrid treeview selecteditem selecteditemchanged


    【解决方案1】:

    答案

    为什么'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;
        }
    

    【讨论】:

    • 感谢您的评论,同时,我也修复了它,另一个Q帮助了我:stackoverflow.com/questions/6586488/…。我是如何解决的:在Grid_GotFocus 中,我调用(VisualHelper.GetAncestorByType(e.Source as DependencyObject, typeof(TreeViewItem)) as TreeViewItem).IsSelected = true; 我想知道它是如何工作的,因为网格没有直接的TreeViewItem Ancestor,但我调试过,它有 - 但你说清楚了(WPF 自动创建它)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2012-01-15
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多