0

私は WPF が初めてで、既存のコードに苦しんでいます。

多くの枝/葉を持つ木があります。1 つのブランチに 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>
4

1 に答える 1

0

への答え

'SelectedItemChanged' がグリッド行をクリックすることと、行のないグリッドをクリックすることが異なるのはなぜですか?

MouseDown はバブリング イベントです。何が起こっているかというと、DataGrid の TextBox がイベントを処理済みとしてマークしたため、TreeViewItem に到達しませんでした (WPF は、マークアップに具体的に含めていなくても TreeViewItem を自動的に作成します)。ヘッダーまたは 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;
    }
于 2016-06-10T20:09:58.773 に答える