首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF:单击DataGrid行在TreeView中不会触发TreeView.SelectedItemChanged

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

Stack Overflow用户
提问于 2016-06-10 07:43:17
回答 1查看 243关注 0票数 0

我是新来的WPF,和一个现有的代码痛苦。

我们有一棵树,它有许多树枝/叶子。在一个分支中,我们有一个DataGrid。

如果我们单击网格的空区域(其中没有行),那么TreeView.SelectedItemChanged将正确调用。在我们的例子中,SelectedItem = 'SelectedGridBorder‘(参见下面的XAML )

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

为什么“SelectedItemChanged”单击网格行或单击没有行的网格是不同的?

谢谢。

XAML:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 20:09:58

对的答案

为什么“SelectedItemChanged”单击网格行或单击没有行的网格是不同的?

MouseDown是一个冒泡事件。正在发生的事情是TextBox of您的DataGrid将事件标记为已处理,因此它从未到达TreeViewItem (WPF自动创建TreeViewItem,即使您没有将它专门包含在标记中)。如果单击标头或RowSelector,它们将不会将事件标记为已处理。

为了得到你期待的行为

代码语言:javascript
复制
//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">

手推工

代码语言:javascript
复制
    private void TreeviewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var treeViewItem = sender as TreeViewItem;
        treeViewItem.IsSelected = true;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37742666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档