2015-11-18 47 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

相關問題