簡體   English   中英

選擇位於RowDetailsTemplate內的WPF DataGrid的單元格

[英]Selecting a cell of a WPF DataGrid which is inside a RowDetailsTemplate

當我有第二個數據網格作為rowdetails模板時,我的數據網格中出現了一些奇怪的行為。 主數據網格綁定到我的項目集合,而細節數據網格綁定到一個項目包含的子項目的集合。 現在,所有這些都可以完美呈現,但是當我想直接單擊SubItemsGrid中的單元格時,它將首先選擇包含SubItemsGrid的主網格中該行的第一個單元格。 我必須再次單擊才能進入要選擇的單元格。

有人也有經驗嗎? 如果是這樣,是否有解決方法?

這是我的標記(部分):

<DataGrid x:Name="ItemGrid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" SelectionUnit="Cell"
          RowDetailsVisibilityMode="Visible" CanUserResizeRows="False" AreRowDetailsFrozen="False" VerticalAlignment="Top"
          CanUserAddRows="False" CanUserDeleteRows="False" VerticalScrollBarVisibility="Hidden">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Column1" Binding="{Binding Path=ID}" Width="350"/>
        <DataGridTextColumn Header="Column2" Binding="{Binding Path=Name}" Width="80"/>
        <DataGridTextColumn Header="Column3" Binding="{Binding Path=Description}" Width="80"/>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid x:Name="SubItemsGrid" ItemsSource="{Binding Path=SubItems}" AutoGenerateColumns="False"
                      SelectionUnit="Cell" HeadersVisibility="None" Margin="50,0,0,0" VerticalAlignment="Top" CanUserAddRows="False" 
                      CanUserResizeRows="False" CanUserDeleteRows="False" BorderThickness="0">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Column1" Binding="{Binding Path=Name}" Width="300" />
                    <DataGridTextColumn Header="Column2" Binding="{Binding Path=Description}" Width="80"/>
                    <!-- Etc.--> 

- -編輯 - -

好的,我想到了處理SubItemsGrid上的mouse-up事件的想法,然后將焦點設置為代碼中的SubItemsGrid,如下所示:

private void SubItemsGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
   DataGrid selectedGrid = sender as DataGrid;
   if (selectedGrid != null)
   {
       selectedGrid.Focus()
   }
}

調試表明,“ Focus”方法在正確的網格上被調用,但是我沒有得到任何視覺結果。 我感覺到我非常接近解決方案。 任何人?

我通過捕獲SubItemsGrid的'SelectedCellsChanged'事件來解決此問題。 在處理程序中,我在引發事件的網格上調用了“ BeginEdit()”。 實際上,這確實將焦點直接放在了單擊的單元格上,但也使該單元格處於編輯模式。 這就是為什么我之后直接調用CancelEdit()的原因。 這將使焦點集中在單元格上,但不在編輯模式下。

private void SubItemsGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
   DataGrid selectedGrid = sender as DataGrid;
   if (selectedGrid != null)
   {
       selectedGrid.BeginEdit();
       selectedGrid.CancelEdit();
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM