WPF:单击TreeView内的DataGrid行不会触发TreeView.SelectedItemChanged [英] WPF: Clicking on a DataGrid Row inside a TreeView does not trigger TreeView.SelectedItemChanged

查看:56
本文介绍了WPF:单击TreeView内的DataGrid行不会触发TreeView.SelectedItemChanged的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是WPF的新手,并且受现有代码的困扰.

I am new to WPF, and suffering with an existing code.

我们有一棵树,上面有许多分支/叶子.在一个分支中,我们有一个DataGrid.

We have a tree, which has many branches/leaves. In one branch we have a DataGrid.

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

If we click on the empty area of the grid (where no rows are), then TreeView.SelectedItemChanged called properly. In our case, SelectedItem = 'SelectedGridBorder' (see XAML below)

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

But if we click on a row/cell of the grid, row gets focused, but TreeView.SelectedItemChanged is NOT called. So TreeView.SelectedItem is still the previously selected item. Is is possible to achieve this (according to me) logical behavior, so when clicking on a row, TreeView.SelectedItemChanged should be called automatically, and TreeView.SelectedItem should be 'SelectedGridBorder', just like clicking on the grid area where no rows are.

为什么"SelectedItemChanged"单击网格行或单击没有行的网格有何不同?

Why is it different for 'SelectedItemChanged' to click on a grid row, or click on a grid where no rows are?

谢谢.

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>

推荐答案

答案

为什么"SelectedItemChanged"单击网格行或单击没有行的网格有何不同?

Why is it different for 'SelectedItemChanged' to click on a grid row, or click on a grid where no rows are?

MouseDown是一个冒泡事件.发生的是您的DataGrid的TextBox将事件标记为已处理,因此它从未到达TreeViewItem(即使您未在标记中明确包含它,WPF也会自动创建TreeViewItem).如果单击页眉"或行选择器",它们将不会将该事件标记为已处理.

MouseDown is a bubbling event. What's happening is the TextBox of your DataGrid marked the event as handled so it never reached TreeViewItem (WPF creates the TreeViewItem automatically even though you didn't specifically include it in your markup). If you clicked on a Header, or RowSelector, they would not mark the event as handled.

要获得您期望的行为

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

这篇关于WPF:单击TreeView内的DataGrid行不会触发TreeView.SelectedItemChanged的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆