简体   繁体   English

在wpf中更新ItemsSource后如何获取DataGrid行?

[英]How to Get DataGrid Rows after updating ItemsSource in wpf?

In my application, there is a datagrid that include listbox as the datagrid Cell.After updating the datagrid ItemsSource,I want to also update the listbox itemsSource. 在我的应用程序中,有一个包含列表框的数据网格作为数据网格单元。更新数据网格ItemsSource之后,我还想更新列表框itemsSource。

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

As the above, after updating the datagrid ItemsSource, also update to the itemssource of the listbox that is datagrid cell. 如上所述,在更新datagrid ItemsSource之后,还应更新到作为datagrid单元的列表框的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 code is as the following. 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>

var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; var row = grid.ItemContainerGenerator.ContainerFromItem(item)as DataGridRow;

The problem is that row is always return null. 问题在于该行始终返回null。

The default for DataGrid is to load the items with Virtualization , Which means the rows load on demand. DataGrid的默认设置是使用Virtualization加载项目,这意味着将按需加载行。

When the item isn't rendered, the item is NOT generated yet. 当未渲染项目时,尚未生成该项目。

Add to your DataGrid: 添加到您的DataGrid:

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

Read more here : DataGrid.EnableRowVirtualization Property 在此处了解更多信息: DataGrid.EnableRowVirtualization属性

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM