我是新来的WPF,和一个现有的代码痛苦。
我们有一棵树,它有许多树枝/叶子。在一个分支中,我们有一个DataGrid。
如果我们单击网格的空区域(其中没有行),那么TreeView.SelectedItemChanged将正确调用。在我们的例子中,SelectedItem = 'SelectedGridBorder‘(参见下面的XAML )
但是,如果我们单击网格中的行/单元格,行就会得到焦点,但不会调用TreeView.SelectedItemChanged。因此,TreeView.SelectedItem仍然是以前选择的项。实现这种逻辑行为是可能的(根据我的说法),所以当单击一行时,应该自动调用TreeView.SelectedItemChanged,而TreeView.SelectedItem应该是“SelectedGrid边界”,就像单击没有行的网格区域一样。
为什么“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>发布于 2016-06-10 20:09:58
对的答案
为什么“SelectedItemChanged”单击网格行或单击没有行的网格是不同的?
MouseDown是一个冒泡事件。正在发生的事情是TextBox of您的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;
}https://stackoverflow.com/questions/37742666
复制相似问题