【问题标题】:Inner datagrid is firing the selection change event of the outer data grid C# WPF内部数据网格正在触发外部数据网格 C# WPF 的选择更改事件
【发布时间】:2018-07-25 17:40:55
【问题描述】:

我有一个使用行详细信息模板的内部数据网格:

<DataGrid x:Name="OuterGrid" SelectionChanged="OuterGrid_SelectionChanged">
  <DataGrid.Columns>
    <DataGridTemplateColumn x:Name ="Header" Header="Header"     IsReadOnly="True" Width="480">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <Expander x:Name="Expander" Grid.Row="0"     Expanded="Expander_Expanded" Collapsed="Expander_Collapsed">
            <Expander.Header>
              <TextBlock x:Name="TextBlockExp" Margin="15,0,0,0" Text="{Binding HeaderLabel}"/>
            </Expander.Header>
            <Grid>
            </Grid>
          </Expander>
          <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource=    {RelativeSource AncestorType=DataGridRow}}" Value="True">
              <Setter Property="Foreground" TargetName="TextBlockExp" Value="White"/>
            </DataTrigger>
          </DataTemplate.Triggers>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    </DataGrid.Columns>

  <DataGrid.RowDetailsTemplate>
    <DataTemplate>
      <DataGrid x:Name="InnerGrid"  SelectionChanged="InnerGrid_SelectionChanged" ItemsSource="{Binding InnerGridList}" SelectedItem="{Binding SelectedSecondItem}">
        <DataGrid.Columns>
          <DataGridTextColumn Header="A" Binding="{Binding AValue}" IsReadOnly="True" Width="320">
          </DataGridTextColumn>
          <DataGridTextColumn Header="B" Binding="{Binding BValue}" IsReadOnly="True" Width="250">
          </DataGridTextColumn>
          <DataGridTextColumn Header="C" Binding="{Binding CValue}" IsReadOnly="True" Width="250">
          </DataGridTextColumn>
        </DataGrid.Columns>
      </DataGrid>
    </DataTemplate>
  </DataGrid.RowDetailsTemplate>
</DataGrid>

外网格和内网格的绑定已经OK了。但是,当我尝试更改内部网格中的选定项时,也会调用外部网格的选择更改事件。

private void OuterGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   if (OuterGrid.SelectedItems.Count > 0)
   {
                OuterGridModel row =     (OuterGridModel)OuterGrid.SelectedItems[0];
                PopulateInnerGrid(row.InnerGridList);
                row.SelectedSecondItem = row.InnerGridList[0];
   }
}

当我使用这一行设置选中项时(如上图):

row.SelectedSecondItem = row.InnerGridList[0];

InnerGrid_SelectionChanged 被解雇,OuterGrid_SelectionChanged 也被解雇。 我只想要InnerGrid_SelectionChanged

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    SelectionChanged 是一个routedevent,它在元素树中冒泡,内部和外部DataGrid 都听它。 解决您的问题的一个简单方法是将SelectionChangedEventArgsHandled 属性设置为true,以便不再处理该事件。

     private void InnerGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
              //...
                e.Handled = true;
            }
    

    【讨论】:

    • 不客气,如果这是您要找的,请接受答案。
    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2013-04-16
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多