[英]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.