none
C# WPF Доступ к объектам в RowDetailsTemplate RRS feed

  • Общие обсуждения

  • Здравствуйте. Как получить доступ к вложенной таблице в 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;
            }

    Могу даже например определить по какой колонке был клик в событии GvLines_OnMouseDoubleClick

    private void GvLines_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
    var gvLine = (DataGrid) sender;
    var column = gvLine.CurrentColumn;
    var showLineStatusColumn = gvLine.FindName("ShowLineStatus") as DataGridColumn;
                if (showLineStatusColumn != null)
                {
                    if (Equals(showLineStatusColumn, column))
                    {
    //код обработки
    }
    }
    }

    Но вот обратиться на прямую к ней не знаю как. Например мне надо выделить определённую строку, ну типо как в примере ниже.

    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;
                    }
                }
    }
                                                                        

Все ответы

  • Кусок кода не столь маленький в него нужно вникать. Может вы словами опишите архитектуру, что бы было понятнее что у вас не получается.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    Модератор