2015-11-18 48 views
0

在我的应用程序中,有一个datagrid包含listbox作为datagrid Cell.After更新DataGrid ItemsSource之后,我还想更新listbox itemsSource。如何在wpf中更新ItemsSource之后获取DataGrid行?

private void DataUpdate() 
if (_dtWorkTime.Rows.Count > 0) 
{ 
    taskDetailGrid.ItemsSource = _dtWorkTime.DefaultView; 
    taskDetailGrid.Items.Refresh(); 
    taskDetailGrid.UpdateLayout(); 
    LisBoxDataUpdate(SelectContacts); 
} 

作为上述,更新数据网格的ItemsSource之后,也更新为是数据网格单元中的列表框的的ItemsSource。

private void LisBoxDataUpdate(ObservableCollection<ContactInfo> SelectContacts) 
     { 
      if (SelectContacts != null) 
      { 
       var row_list = GetDataGridRows(taskDetailGrid); 
       foreach (DataGridRow single_row in row_list) 
       { 
        if (single_row == null) break; 
        if (single_row.IsSelected == true) 
        { 
         ListBox memberGrid = FindChild<ListBox>(single_row, "memberListBox"); 
         memberGrid.ItemsSource = SelectContacts; 

         Button btnMemberAdd = FindChild<Button>(single_row, "btnMemberAdd"); 

         if (SelectContacts.Count <= 0) 
         { 
          memberGrid.Visibility = Visibility.Hidden; 
          btnMemberAdd.Visibility = Visibility.Visible; 
         } 
         else 
         { 
          memberGrid.Visibility = Visibility.Visible; 
          btnMemberAdd.Visibility = Visibility.Hidden; 
         } 
         break; 
        } 
       } 
      } 
     } 

public IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid) 
     { 
      var itemsSource = grid.ItemsSource as IEnumerable; 

      if (null == itemsSource) 
      { 
       yield return null; 
      } 

      foreach (var item in itemsSource) 
      { 
       var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; 
       if (null != row) 
       { 
        yield return row; 
       } 
      } 
     } 

XAML代码如下。

<DataGrid x:Name="taskDetailGrid" Margin="0,0,-0.333,0.333" VerticalScrollBarVisibility="Hidden" 
        HorizontalScrollBarVisibility="Hidden" HeadersVisibility="None" RowHeight="80" 
        AutoGenerateColumns="False" CanUserAddRows="False" BorderThickness="1" Background="#FFFFFF" 
        ScrollViewer.CanContentScroll="True" AlternationCount="2" 
        HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectionChanged="taskDetailGrid_SelectionChanged" Grid.ColumnSpan="2" DataContextChanged="taskDetailGrid_DataContextChanged"> 
<DataGrid.Columns> 
        <DataGridTemplateColumn x:Name="userControlColumn" Header="Column1" IsReadOnly="True" Width="*"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <StackPanel x:Name="stkPanel"> 
<ListBox x:Name="memberListBox" Margin="440,-55,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding SelectContacts}" 
             ItemTemplate="{StaticResource ContactInfoTemplate}" Visibility="Hidden" Width="150" PreviewMouseDown="memberListBox_PreviewMouseDown"> 
            </ListBox> 
            <TextBox x:Name="txtComment" Text="{Binding ReportComment}" VerticalAlignment="Top" HorizontalAlignment="Right" Margin="0,-55,3,0" Width="250" Height="50" 
              TextWrapping="Wrap" AcceptsReturn="True"/> 
           </StackPanel> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
</DataGrid.Columns> 
      </DataGrid> 

变种行= grid.ItemContainerGenerator.ContainerFromItem(项目)作为 DataGridRow;

问题是行总是返回null。

+0

你能告诉XAML代码与您的数据网格? – galakt

+0

我使用XAML代码编辑了我的问题。 – ammoe

+0

解决方案可以在这里找到。 http://stackoverflow.com/questions/10591391/why-itemcontainergenerator-containerfromindex-returns-null-and-how-to-avoid-th – Slasko

回答

0

DataGrid的默认值是加载项目Virtualization,这意味着行按需加载。

当项目未呈现时,项目尚未生成。

添加到您的数据网格:

EnableRowVirtualization="False" 
VirtualizingStackPanel.IsVirtualizing="False" 

在这里阅读更多:DataGrid.EnableRowVirtualization Property

+0

这是正确的答案,谢谢 – ammoe

+0

我把每个行的itemssource放在不同的值,但所有的listbox itemssource都是一样的。怎么了? – ammoe

相关问题