2010-12-07 2 views
0

Я испытываю какое-то странное поведение в своем datagrid, когда у меня есть второй datagrid как rowdetailstemplate. Основной файл данных привязан к моей коллекции элементов, а детали datagrid привязаны к набору подэлементов, содержащихся в элементе. Теперь все это получается отлично, но когда я хочу напрямую щелкнуть по ячейке в SubItemsGrid, он сначала выбирает первую ячейку строки в основной сетке, в которой содержится SubItemsGrid. Я должен щелкнуть второй раз, чтобы добраться до ячейки, которую я хочу выбрать.Выбор ячейки WPF DataGrid, которая находится внутри RowDetailsTemplate

Неужели кто-нибудь так себя зарекомендовал? И если так, есть ли обходной путь?

Это моя наценка (частично):

<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.--> 

--- EDIT ---

Хорошо, я пришел с идеей, чтобы справиться с мышью вверх событие на SubItemsGrid , а затем установите фокус на SubItemsGrid в коде, например:

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

отладки показывают, что метод «фокус» вызывается на правой сетке, но я не получаю никаких визуальных результатов. У меня такое чувство, что я очень близок к решению. Кто угодно?

ответ

0

Я исправил это, поймав событие SelectedCellsChanged SubItemsGrid. В обработчике я вызвал «BeginEdit()» на сетке, которая подняла событие. Это действительно сфокусировалось на нажатой ячейке напрямую, но также помещает ячейку в режим редактирования. Вот почему я вызвал CancelEdit() сразу после. Это будет держать фокус на ячейке, но не в режиме редактирования.

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

Проглатывание первого щелчка - это то, что я видел сам, хотя и не с детской сеткой. Он также прокомментирован в [этой ветке sliverlight.net] (http://forums.silverlight.net/forums/p/208961/491280.aspx). У меня еще не сложилось общее решение. – 2011-04-21 15:20:04

Смежные вопросы