Здравствуйте. Как получить доступ к вложенной таблице в RowDetailsTemplate (т.е. таблица в таблице). Код XAML
| Код | <Grid> <DataGrid Name="GvHeader" AutoGenerateColumns="False" HorizontalScrollBarVisibility="Auto" CanUserDeleteRows="False" CanUserAddRows="False" CanUserResizeColumns="True" CanUserReorderColumns="False" CanUserResizeRows="False" AllowDrop="False" RowDetailsVisibilityMode="Collapsed" IsReadOnly="True" ClipboardCopyMode="ExcludeHeader" SelectionMode="Single" SelectionChanged="GvHeader_SelectionChanged"> <DataGrid.RowStyle> <St yle TargetType="{x:Type DataGridRow}"> <EventSetter Event="MouseDoubleClick" Handler="HeaderRowDoubleClick"/> <EventSetter Event="Unselected" Handler="HeaderRowUnselected"></EventSetter> </Style> </DataGrid.RowStyle> <DataGrid.RowDetailsTemplate> <DataTemplate> <DataGrid x:Name="GvLines" AutoGenerateColumns="False" HorizontalScrollBarVisibility="Auto" CanUserDeleteRows="False" CanUserAddRows="False" CanUserResizeColumns="True" CanUserReorderColumns="False" CanUserResizeRows="False" AllowDrop="False" IsReadOnly="True" ClipboardCopyMode="ExcludeHeader" SelectionMode="Single" ItemsSource="{Binding Path=Lines}" SelectionChanged="GvLines_SelectionChanged" MouseDoubleClick="GvLines_OnMouseDoubleClick"> <DataGrid.Columns> <DataGridTemplateColumn x:Name="ShowLineStatus" CanUserSort="False" IsReadOnly="True" Width="22">
<DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Width="20" Name="pop" Height="20" ToolTip="Восстановить" Source="/Management;component/Images/key_enter.png"> </Image> <DataTemplate.Triggers> <DataTrigger Binding="{Binding CancelSatatus}" Value="False"> <Setter TargetName="pop" Property="Source" Value="/Management;component/Images/cancel.png"/> <Setter TargetName="pop" Property="ToolTip" Value="Отменить"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
<DataGridTextColumn x:Name="ColumnNumber" Header="oooo1" MinWidth="50" Width="Auto" Binding="{Binding Path=line1,Mode=OneWay}"/> <DataGridTextColumn Header="ooo2" MinWidth="20" Width="Auto" CellSt yle="{StaticResource CellStyleCenter}" Binding="{Binding Path=line2,Mode=OneWay}"/> <DataGridTextColumn Header="00003" MinWidth="50" Width="Auto" Binding="{Binding Path=line3,Mode=OneWay}"/> </DataGrid.Columns> </DataGrid> </DataTemplate> </DataGrid.RowDetailsTemplate> <DataGrid.Columns> <DataGridTextColumn x:Name="Number" Header="Номер" MinWidth="50" Width="Auto" Binding="{Binding Path=head1,Mode=OneWay}"/> <DataGridTextColumn Header="Sss" MinWidth="20" Width="Auto" CellSt yle="{StaticResource CellStyleCenter}" Binding="{Binding Path=head2,Mode=OneWay}"/> </DataGrid.Columns> </DataGrid> </Grid>
|
код С# (тестовые данные которые биндятся с главной таблицей по Header-у, а дочерняя таблица биндится с Lines)
| Код | var line1 = new List<ILine> { new Line("head11","h1line11", "h1line12", "h1line13", "h1line14"), new Line("head11","h1line21", "h1line22", "h1line23", "h1line24"), new Line("head11","h1line31", "h1line32", "h1line33", "h1line34"), new Line("head11","h1line41", "h1line42", "h1line43", "h1line44") };
var line2 = new List<ILine> { new Line("head21","h2line11", "h2line12", "h2line13", "h2line14"), new Line("head21","h2line21", "h2line22", "h2line23", "h2line24"), new Line("head21","h2line31", "h2line32", "h2line33", "h2line34") }; var header = new List<Header> { new Header("head11", "head12", "head13", "head14"), new Header("head21", "head22", "head23", "head24") };
header[0].SetLines(line1); header[1].SetLines(line2);
Global_H_items.AddRange(header);
GvHeader.ItemsSource = null; GvHeader.ItemsSource = Global_H_items;
|
Подскажите пожалуйста, как получить доступ к таблице GvLines. Просто по имени к ней обратиться не могу, как к таблице GvHeader (например GvHeader.ItemsSource). Получить данные из неё я могу, подписавшись на событие GvLines_SelectionChanged
| Код | private void GvLines_SelectionChanged(object sender, SelectionChangedEventArgs e) { var GvLines = (DataGrid)sender; var temp = (ILine)GvLines.SelectedItem; TbInfo.Text = temp.line4; }
|
Но вот обратиться на прямую к ней не знаю как. Например мне надо выделить определённую строку, ну типо как в примере ниже. public void IsBlock(bool value, IHeader sel_header, ILine sel_line)//функция блокирует/разблокирует вьюшку при каких-либо операциях { if (!this.Dispatcher.CheckAccess()) { this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action<Boolean, IHeader, ILine>(IsBlock), value, sel_header); return; }
GridMain.IsEnabled = value;
if (sel_header != null) { GvHeader.ScrollIntoView(sel_header); GvHeader.SelectedItem = sel_header; }
if (sel_line != null) { var row = (DataGridRow)GvHeader.ItemContainerGenerator.ContainerFromIndex(GvHeader.SelectedIndex); row.DetailsVisibility = Visibility.Visible; //вот тут то и проблема, надо как-то получить dgLines, а как не знаю if (dgLines != null) { dgLines.ScrollIntoView(sel_line); dgLines.SelectedItem = sel_line; } } }
|