WPF: щелчок по строке DataGrid внутри TreeView не вызывает TreeView.SelectedItemChanged
Я новичок в 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>
1 ответ
Ответ на
Почему "SelectedItemChanged" отличается от щелчка по строке сетки или щелчка по сетке, где нет строк?
MouseDown - это бурлящее событие. Происходит то, что TextBox вашей DataGrid пометил событие как обработанное, чтобы оно никогда не достигало 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;
}