![](/img/trans.png)
[英]Button inside RowDetailsTemplate in DataGrid - how to know which row clicked on?
[英]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.