Как сделать в DataGrid колонку с текстом и и другой таблицей?

У меня есть 2 класса =>pastebin по модели базы. По идее Пакет состоит из Плавок (>= 1 шт). Как мне в таблице, где содержатся Пакеты, создать колонку где будут через запятую перечислены плавки и рядом кнопка (или ComboBox) показывающий таблицу плавок и при выборе добавлялись бы в список.

что то вроде этого image.png
Но я таблицу привязал к одному списку, а это уже будет другой список, не знаю как мне быть
  • Вопрос задан
  • 3578 просмотров
Решения вопроса 1
@Teacher
Добрый день.
Для того, чтобы сделать такой столбец, вам придется:
1. Использовать столбец на основе DataTemplate. В нем будет пропущенный через конвертор список плавок (через конвертор, чтобы он собрал их все в строку с запятыми) и ComboBox для выбора.
2. В ComboBox необходимо будет сделать привязку ItemsSource не напрямую к свойству, а через FindAncestor. Как нибудь так:
<ComboBox ItemsSource="{Binding Path=DataContext.Collections, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"  />

К сожалению конретный пример не покажу, т.к. не знаю используете вы MVVM или нет, как у вас называются коллекции и т.д.
Если что-то не понятно, то спрашивайте, постараюсь помочь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Voucik
Вот пример:
Создаём табличку с вложенной таблицей DataTemplate.
<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">

            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <EventSetter Event="MouseDown"  Handler="HeaderRowMouseDown"/>
                    <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}">
                        <DataGrid.Columns>
                            <DataGridTextColumn
                                        Header="B1"                                                                                  
                                        Binding="{Binding Path=B,Mode=OneWay}"/>
                            <DataGridTextColumn
                                        Header="B2"                                                                                  
                                        Binding="{Binding Path=BB,Mode=OneWay}"/>
                            <DataGridTextColumn
                                        Header="B3"                                                                                  
                                        Binding="{Binding Path=BBB,Mode=OneWay}"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
            <DataGrid.Columns>

                <DataGridTextColumn
                                        Header="A1"                                                                                  
                                        Binding="{Binding Path=A,Mode=OneWay}"/>
                <DataGridTextColumn
                                        Header="A2"                                                                                  
                                        Binding="{Binding Path=AA,Mode=OneWay}"/>
                <DataGridTextColumn
                                        Header="A3"                                                                                  
                                        Binding="{Binding Path=AAA,Mode=OneWay}"/>
            </DataGrid.Columns>
        </DataGrid>


Теперь создадим два класса для теста
public class Header
    {
        public String A { get; private set; }
        public String AA { get; private set; }
        public String AAA { get; private set; }

        public List<Line> Lines { get; private set; } 

        public Header(string a, string aa, string aaa,ICollection<Line> lines)
        {
            A = a;
            AA = aa;
            AAA = aaa;

            Lines = new List<Line>();
            if (lines != null && lines.Count > 0)
            {
                Lines.AddRange(lines);
            }
        }
    }

И
public class Line
    {
        public String B { get; private set; }
        public String BB { get; private set; }
        public String BBB { get; private set; }

        public Line(string b, string bb, string bbb)
        {
            B = b;
            BB = bb;
            BBB = bbb;
        }
    }

Теперь перейдём в код формы и напишем следующий код.
public partial class MainWindow : Window
    {
        public List<Header> header;
        public MainWindow()
        {
            InitializeComponent();

            //заполняем тестовыми данными
            header = new List<Header>
            {
                new Header("a1", "a2", "a3", new List<Line>
                {
                    new Line("a", "b", "c"),
                    new Line("d", "1", "2")
                }),
                new Header("a11", "a22", "a33", new List<Line>
                {
                    new Line("b1", "b2", "b3"),
                    new Line("b11", "b2222", "b333"),
                    new Line("b1111", "b22", "b3"),
                    new Line("dsxfds", "sdfsdf", "sfsdf")
                }),
                new Header("a1", "a2", "a3", new List<Line>
                {
                    new Line("bb1", "b1", "ab"),
                    new Line("bb2", "b2", "bb"),
                    new Line("bb3", "b3", "cb")
                }),
            };

            GvHeader.ItemsSource = header;//связываем главную табличку с нашими данными
        }

        //собитие, которое происходит при RowUnselected (тоесть когда выделение строки пропадает)-прячет подтаблицу
        private void HeaderRowUnselected(object sender, RoutedEventArgs e)
        {
            if (sender == null)
            {
                return;
            }
            var row = (DataGridRow)sender;
            row.DetailsVisibility = Visibility.Collapsed;
        }
        //собитие, которое происходит при MouseDown-показывает подтаблицу
        private void HeaderRowMouseDown(object sender, MouseButtonEventArgs e)
        {
            if (sender == null)
            {
                return;
            }
            var row = (DataGridRow)sender;
            row.DetailsVisibility = row.DetailsVisibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
        }
    }

22d55d41265b462701ddc786e3427b18.png

Ещё можно посмотреть код тут.
http://social.msdn.microsoft.com/Forums/ru-RU/f41b870b-cc74-45fe-872c-15dec9acf55a/c-wpf-rowdetailstemplate?forum=fordesktopru
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы