Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/30: Рейтинг темы: голосов - 30, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 22.08.2019
Сообщений: 13
1
WPF

Сложная таблица

22.08.2019, 14:12. Показов 5717. Ответов 16
Метки wpf, xaml (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, не могу создать таблицу. В самой таблице ничего изменять не надо, а просто показать. Ее код скорее всего придется генерировать в c# и там же заполнять. В строке содержится массив часов. Шапка динамичная.
Есть вариант в c# слепить что-то похожее на таблицу из label и textblock

Заменить &#_13 на него же без _
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<Window x:Class="Busyness.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Busyness"
        xmlns:entities="clr-namespace:DataAccessLayerCommon.Entities;assembly=DataAccessLayerCommon"
        xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
        mc:Ignorable="d"
 
    Title="MainWindow" Height="450" Width="810">
    <Window.Resources>
        <ResourceDictionary Source="Styles.xaml"/>
    </Window.Resources>
 
    <Grid x:Name="EmployeesListHeader">
    <DataGrid CanUserResizeColumns="False">
        <DataGrid.Columns>  
            <DataGridTextColumn Header="Дата"  />
 
            <DataGridTextColumn >
                <DataGridTextColumn.Header>
                    <Label Content="Петров &#_13;Сборка" />
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
 
            <DataGridTextColumn>
                <DataGridTextColumn.Header>
                    <Label Content="Иванов &#_13;Склейка" />
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            
            <DataGridTextColumn>
                <DataGridTextColumn.Header>
                    <Label Content="Петров &#_13;Сборка"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
 
            <DataGridTextColumn>
                <DataGridTextColumn.Header>
                    <Label Content="Петров &#_13;Сборка"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn>
                <DataGridTextColumn.Header>
                    <Label Content="Петров &#_13;Сборка"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn>
                <DataGridTextColumn.Header>
                    <Label Content="Петров &#_13;Сборка"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn>
                <DataGridTextColumn.Header>
                    <Label Content="Петров &#_13;Сборка"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
    </Grid>
</Window>
Миниатюры
Сложная таблица   Сложная таблица  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2019, 14:12
Ответы с готовыми решениями:

Сложная таблица
Добрый день! Прошу сильно не пинать, только начинаю изучать WPF. Подскажите, как реализовать...

Сложная таблица - два TextBox в одной ячейке
Камрады!! Задачка не беручка!!! Нужно сделать таблицу как на рисунке внизу... Что бы в клетке было...

TreeView сложная иерархия
Делаю анализатор сборок (*.dll). Надо выводить результат в форме: Namespace1 имя class1 имя...

Сложная структура данных
Есть коллекции данных заказов и людей. При этом одному человеку может соответствовать несколько...

16
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
22.08.2019, 16:46 2
EZhandrs, примерно так

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<ListView x:Name="listView" ItemsSource="{Binding Data}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn >
                            <GridViewColumnHeader Content="Один" />
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel >
                                        <TextBlock Text="{Binding Member.One}" />
                                        <TextBlock Text="{Binding Member.Two}" />
                                    </StackPanel>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn DisplayMemberBinding="{Binding Two}">
                            <GridViewColumnHeader Content="Два" />
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
В vm сделайте ObservableCollection<Data>

C#
1
2
3
4
5
6
7
8
9
10
11
12
internal class Data
    {
        public Member Member{ get; set; } 
        public string Two{ get; set; } 
    }
 
 
internal class Member
    {
        public string One{ get; set; } 
        public string Two{ get; set; } 
    }
Ну и vm вы добавляете данные
C#
1
2
3
4
5
6
7
8
9
collect,Add(new Data
{
Two = "Два",
Member = new Member
{
One = "Один111",
Two = "Два322"
}
}
1
1580 / 585 / 184
Регистрация: 05.12.2015
Сообщений: 938
22.08.2019, 17:29 3
Точно с таким же названием тема
Сложная таблица
0
0 / 0 / 0
Регистрация: 22.08.2019
Сообщений: 13
22.08.2019, 18:59  [ТС] 4
Defences, спасибо, но у меня шапка не фиксирована. Можно как-то ее задавать? Я хочу передавать массив сотрудников, а у них есть массив задач. В задаче указано количество часов и дата.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Employee
    {
        public Task[] tasks { get; set; }
        public Position position { get; set; }
    }
 
class Task
    {
        public DateTime date { get; set; }
        public double hours {get; set; }
    }
 
class Position
    {
        public string name { get; set; }
    }
0
Модератор
Эксперт .NET
15468 / 10713 / 2787
Регистрация: 21.04.2018
Сообщений: 31,540
Записей в блоге: 2
22.08.2019, 19:37 5
Цитата Сообщение от EZhandrs Посмотреть сообщение
не могу создать таблицу
Простого решения вашей задачи не будет.
Вместо DataGrid, наверное, лучше подойдёт ItemsControl.

Что бы дать конкретный совет надо больше информации:
  1. В шапке первой колонки всегда отдельно задаваемый заголовок?
  2. Откуда у вас поступает информация для шапок других колонок? Или вы собираетесь её в "ручную" в коде задавать?
  3. Откуда у вас поступает информация для ячеек строк?
  4. Сколько цифр может быть в одной ячейке?
  5. По какому правилу надо задавать высоту для субячейки с цифрой?
  6. Какими должны быть ширины колонок? Задаются "в ручную", автоматически по ширине заголовка?
0
0 / 0 / 0
Регистрация: 22.08.2019
Сообщений: 13
22.08.2019, 20:27  [ТС] 6
1. В шапке в первом столбце всегда дата. Дальше идет список сотрудников и их должности
2. Из бд берется информация. Для примера информацию задал в xaml. В идеале, чтоб сами создавались колонки в зависимости от количества сотрудников.
3. Из свойств сотрудников. У сотрудника есть массив задач. В задаче дата и количество часов.
4. [0-16]. 8 - их сумма. Минимум может быть 0.5, максимум - 8.
5. Фиксированная высота * цифра.
6. Любая ширина, чтоб информация была видна.

Думаю перевернуть таблицу, чтоб легче было. В шапке будет: | Сотрудник | 20.08.19 | 21.08.19 | 22.08.19 | 23.08.19|
0
Модератор
Эксперт .NET
15468 / 10713 / 2787
Регистрация: 21.04.2018
Сообщений: 31,540
Записей в блоге: 2
22.08.2019, 21:11 7
Цитата Сообщение от EZhandrs Посмотреть сообщение
2. Из бд берется информация. Для примера информацию задал в xaml. В идеале, чтоб сами создавались колонки в зависимости от количества сотрудников.
То есть у вас есть какие-то DataTable?
XAML - в данном случае, не поможет.
Нужно в VM задать список с нужной структурой.

Цитата Сообщение от EZhandrs Посмотреть сообщение
3. Из свойств сотрудников. У сотрудника есть массив задач. В задаче дата и количество часов.
Эта инфа тоже в DataTable?

Цитата Сообщение от EZhandrs Посмотреть сообщение
4. [0-16]. 8 - их сумма. Минимум может быть 0.5, максимум - 8.
То есть дискретность в полчаса?

Цитата Сообщение от EZhandrs Посмотреть сообщение
5. Фиксированная высота * цифра.
Придётся применять или мультиконвертер, или UC, или и то и то.
Вы умеете их создавать, использовать?

Цитата Сообщение от EZhandrs Посмотреть сообщение
6. Любая ширина, чтоб информация была видна.
То есть, кроме дат, автоширина по заголовку.

Цитата Сообщение от EZhandrs Посмотреть сообщение
Думаю перевернуть таблицу, чтоб легче было. В шапке будет: | Сотрудник | 20.08.19 | 21.08.19 | 22.08.19 | 23.08.19|
Мне об этом трудно судить.
Удобство зависит от многих факторов конкретного использования.
Подумайте как лучше.
0
0 / 0 / 0
Регистрация: 22.08.2019
Сообщений: 13
22.08.2019, 22:46  [ТС] 8
Данные из SQL беру с помощью EF.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть дискретность в полчаса?
Да
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы умеете их создавать, использовать?
Не, но попробую сделать


Лучше начальный вариант
0
Модератор
Эксперт .NET
15468 / 10713 / 2787
Регистрация: 21.04.2018
Сообщений: 31,540
Записей в блоге: 2
22.08.2019, 23:06 9
Цитата Сообщение от EZhandrs Посмотреть сообщение
Не, но попробую сделать
Лучше начальный вариант
Да, хотел сделать.
Но выбираю вариант чтобы вам было проще понять.
Поэтому интересуюсь вашими знаниями.

Знаете как реализовывать MVVM?
Что такое привязки?
1
Модератор
Эксперт .NET
15468 / 10713 / 2787
Регистрация: 21.04.2018
Сообщений: 31,540
Записей в блоге: 2
22.08.2019, 23:28 10
Лучший ответ Сообщение было отмечено EZhandrs как решение

Решение

Цитата Сообщение от EZhandrs Посмотреть сообщение
попробую сделать
Я пока создал структуру для привязки View.
Посмотрите сможете перегнать в неё данные из БД?
C#
1
2
3
4
5
6
7
8
9
    public class HeaderClass : OnPropertyChangedClass
    {
        private object _header;
 
        public object Header { get => _header; set { _header = value; OnPropertyChanged(); } }
        public HeaderClass() { }
        public HeaderClass(object header) : this()
            => Header = header;
    }
C#
1
2
3
4
5
6
7
8
9
10
11
    public class ColumnHeaders : HeaderClass
    {
        public new string Header { get => (string)base.Header; set => base.Header = value; }
 
        private double _width;
 
        public double Width { get => _width; set { _width = value; OnPropertyChanged(); } }
        public ColumnHeaders() : base() { }
        public ColumnHeaders(string header) : base(header) { }
 
    }
C#
1
2
3
4
5
6
7
8
9
    public class DataColumnsHeadersClass : ColumnHeaders
    {
        public ObservableCollection<ColumnHeaders> ColumnsHeaders { get; } = new ObservableCollection<ColumnHeaders>();
 
        public DataColumnsHeadersClass() : base() { }
        public DataColumnsHeadersClass(string mainHeader, params string[] headers)
            : base(mainHeader)
            => headers.ToList().ForEach(header => ColumnsHeaders.Add(new ColumnHeaders(header)));
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public class DataRowsClass : HeaderClass
    {
        private double _height;
 
        public double Height { get => _height; set { _height = value; OnPropertyChanged(); } }
        public new DateTime Header { get => (DateTime)base.Header; set => base.Header = value; }
        public ObservableCollection<DataRowCellsClass> Cells { get; } = new ObservableCollection<DataRowCellsClass>();
 
        public DataRowsClass() : base() { }
        public DataRowsClass(DateTime header) : base(header) { }
        public DataRowsClass(DateTime header, params DataRowCellsClass[] cells)
            : this(header)
            => cells.ToList().ForEach(hour => Cells.Add(hour));
    }
C#
1
2
3
4
5
6
7
    public class DataRowCellsClass
    {
        public ObservableCollection<double> Hours { get; } = new ObservableCollection<double>();
 
        public DataRowCellsClass(params double[] hours)
            => hours.ToList().ForEach(hour => Hours.Add(hour));
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    public class DataTableClass : OnPropertyChangedClass
    {
        private string _nameTable;
 
        public string NameTable { get => _nameTable; set { _nameTable = value; OnPropertyChanged(); } }
 
        private DataColumnsHeadersClass _columnsHeaders;
        public DataColumnsHeadersClass ColumnsHeaders { get => _columnsHeaders; private set { _columnsHeaders = value; OnPropertyChanged(); } }
 
        private readonly ObservableCollection<HeaderClass> rows = new ObservableCollection<HeaderClass>();
        public IEnumerable<HeaderClass> Rows => rows;
        public void InitialHeaders(params string[] headers)
        {
            ColumnsHeaders = new DataColumnsHeadersClass(headers);
            rows.Clear();
            rows.Add(ColumnsHeaders);
        }
 
        public int ColumnsCount() => ColumnsHeaders.ColumnsHeaders.Count;
 
        public bool AddRow(DateTime date, params double[][] hours)
        {
            if (hours.Length != ColumnsCount())
                return false;
 
            List<DataRowCellsClass> cells = new List<DataRowCellsClass>();
            foreach (double[] hrs in hours)
            {
                if (hrs.Sum() > 8.0)
                    return false;
                cells.Add(new DataRowCellsClass(hrs));
            }
            rows.Add(new DataRowsClass(date, cells.ToArray()));
            return true;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public class TableVM : OnPropertyChangedClass
    {
 
        public DataTableClass Table { get; } = new DataTableClass();
 
 
        public void LoadData()
        {
            Table.InitialHeaders("Дата", "Петров\r\nСборка", "Иванов\r\nСклейка", "Сидоров\r\nОклейка", "Зайцев\r\nПокраска");
            Table.AddRow
                (
                    new DateTime(18, 8, 22),
                    new double[] { 3, 3 },
                    new double[] { 1.5, 4 },
                    new double[] { 2 },
                    new double[] { }
                );
 
        }
 
        public TableVM() => LoadData();
    }
1
0 / 0 / 0
Регистрация: 22.08.2019
Сообщений: 13
23.08.2019, 01:32  [ТС] 11
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Знаете как реализовывать MVVM?
Что такое привязки?
Не, утром почитаю про них)

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я пока создал структуру для привязки View.
Посмотрите сможете перегнать в неё данные из БД?
Огромное спасибо. Да, смогу. Вы сделали очень удобное добавление)
0
0 / 0 / 0
Регистрация: 22.08.2019
Сообщений: 13
23.08.2019, 17:27  [ТС] 12
Не могу понять, как это вывести. Table смог заполнить данными. Дописал класс OnPropertyChangedClass
А как составить View?
0
Модератор
Эксперт .NET
15468 / 10713 / 2787
Регистрация: 21.04.2018
Сообщений: 31,540
Записей в блоге: 2
23.08.2019, 19:29 13
Цитата Сообщение от EZhandrs Посмотреть сообщение
А как составить View?
У меня со временем туговато.
Буду закидывать код по возможности.
0
1580 / 585 / 184
Регистрация: 05.12.2015
Сообщений: 938
23.08.2019, 21:54 14
EZhandrs, у тебя концепция таблицы неправильная.
по горизонтали должны быть Entity, то есть твои сотрудники
по вертикали, то есть в колонках - категории (свойства) этих Entity.
0
Модератор
Эксперт .NET
15468 / 10713 / 2787
Регистрация: 21.04.2018
Сообщений: 31,540
Записей в блоге: 2
25.08.2019, 02:18 15
Лучший ответ Сообщение было отмечено EZhandrs как решение

Решение

Цитата Сообщение от EZhandrs Посмотреть сообщение
А как составить View?
Катастрофически не хватает времени.
Сделал на скорую руку - "красоту" сами наведите.
Принцип, надеюсь, поймёте.

UC - для отображения одной ячейки и конвертер для его работы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    /// <summary>Вычисляет пропорцию values[0]*values[1]/values[2]</summary>
    public class ProportionConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            double value = (double)values[0];
            double x = (double)values[1];
            double y = (double)values[2];
            return value * x / y;
        }
 
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    /// <summary>
    /// Логика взаимодействия для CellUC.xaml
    /// </summary>
    public partial class CellUC : Grid
    {
        public CellUC()
        {
            InitializeComponent();
        }
 
 
        /// <summary>
        /// 
        /// </summary>
        public double MaxSumValues
        {
            get { return (int)GetValue(MaxSumValuesProperty); }
            set { SetValue(MaxSumValuesProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for SumValues.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MaxSumValuesProperty =
            DependencyProperty.Register(nameof(MaxSumValues), typeof(double), typeof(CellUC), new PropertyMetadata(8.0));
 
 
 
        public ObservableCollection<double> ValuesSource
        {
            get { return (ObservableCollection<double>)GetValue(ValuesSourceProperty); }
            set { SetValue(ValuesSourceProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for ValuesSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ValuesSourceProperty =
            DependencyProperty.Register(nameof(ValuesSource), typeof(ObservableCollection<double>), typeof(CellUC), new PropertyMetadata(null, (PropertyChangedCallback)ValuesSourceChangedCallback));
 
        private static void ValuesSourceChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is CellUC cellUC)
            {
                ObservableCollection<double> oldValues = e.OldValue as ObservableCollection<double>;
                ObservableCollection<double> newValues = e.NewValue as ObservableCollection<double>;
                if (oldValues != null)
                    oldValues.CollectionChanged -= cellUC.CollectionChanged;
                if (newValues != null)
                    newValues.CollectionChanged += cellUC.CollectionChanged;
            }
        }
 
        private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            DifferenceValues = MaxSumValues - ((IEnumerable<double>)sender).Sum();
        }
 
 
 
        public double DifferenceValues
        {
            get { return (int)GetValue(DifferenceValuesProperty); }
            set { SetValue(DifferenceValuesProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for Difference.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DifferenceValuesProperty =
            DependencyProperty.Register(nameof(DifferenceValues), typeof(double), typeof(CellUC), new PropertyMetadata(8.0));
 
 
    }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<Grid x:Name="PART_Parent" x:Class="TableCF.WPFLibrary.CellUC" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:TableCF.WPFLibrary"
         xmlns:sys="clr-namespace:System;assembly=mscorlib"
         mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid.Resources>
        <local:ProportionConverter x:Key="ProportionConverter"/>
    </Grid.Resources>
    <StackPanel>
        <ItemsControl ItemsSource="{Binding ValuesSource, ElementName=PART_Parent}" >
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type sys:Double}">
                    <Border BorderThickness="1" BorderBrush="Black">
                        <Border.Height>
                            <MultiBinding Converter="{StaticResource ProportionConverter}">
                                <Binding/>
                                <Binding Path="ActualHeight" ElementName="PART_Parent"/>
                                <Binding Path="MaxSumValues" ElementName="PART_Parent"/>
                            </MultiBinding>
                        </Border.Height>
                        <TextBlock Text="{Binding StringFormat='0.0'}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Grid>
View
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<Window x:Class="TableCF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TableCF"
        xmlns:viewModel="clr-namespace:TableCF.ViewModel"
        xmlns:model="clr-namespace:TableCF.LocalModel"
        xmlns:lib="clr-namespace:TableCF.Library"
        xmlns:wpfLib="clr-namespace:TableCF.WPFLibrary"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <viewModel:TableVM x:Key="ViewModel"/>
        <sys:Double x:Key="Column.Header.Width">60</sys:Double>
        <sys:Double x:Key="Column.Data.Width">70</sys:Double>
    </Window.Resources>
    <Window.DataContext>
        <Binding Mode="OneWay" Source="{StaticResource ViewModel}"/>
    </Window.DataContext>
    <StackPanel DataContext="{Binding Table, Mode=OneWay}" >
        <StackPanel Orientation="Horizontal" DataContext="{Binding ColumnsHeaders, Mode=OneWay}">
            <TextBlock Text="{Binding Header}" Width="{Binding Mode=OneWay, Source={StaticResource Column.Header.Width}}" 
                       VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
            <ItemsControl x:Name="headersList" ItemsSource="{Binding ColumnsHeaders}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate DataType="{x:Type  model:ColumnHeaders}">
                        <TextBlock Text="{Binding Header}" Width="{Binding Mode=OneWay, Source={StaticResource Column.Data.Width}}"
                                   VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </StackPanel>
        <ItemsControl ItemsSource="{Binding Rows}">
            <ItemsControl.ItemTemplate>
                <DataTemplate  DataType="{x:Type model:DataRowsClass}">
                    <Border BorderThickness="1" BorderBrush="Black">
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Header, StringFormat='dd.MM.yy'}" Width="{Binding Mode=OneWay, Source={StaticResource Column.Header.Width}}" 
                                   VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
                            <ItemsControl ItemsSource="{Binding Cells}">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate DataType="{x:Type model:DataRowCellsClass}">
                                        <Border BorderThickness="1" BorderBrush="Black" Width="{Binding Mode=OneWay, Source={StaticResource Column.Data.Width}}">
                                            <wpfLib:CellUC ValuesSource="{Binding Hours}" MaxSumValues="8"/>
                                        </Border>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Horizontal"/>
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemContainerStyle>
                                    <Style TargetType="ContentPresenter">
                                        <Setter Property="Height" Value="80"/>
                                    </Style>
                                </ItemsControl.ItemContainerStyle>
                            </ItemsControl>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
 
    </StackPanel>
</Window>
Архив проекта прилагаю
Вложения
Тип файла: 7z TableCF.7z (31.9 Кб, 27 просмотров)
2
0 / 0 / 0
Регистрация: 22.08.2019
Сообщений: 13
25.08.2019, 23:28  [ТС] 16
Огромное спасибо Вам. День разбирался в коде, но что-то понял
0
Модератор
Эксперт .NET
15468 / 10713 / 2787
Регистрация: 21.04.2018
Сообщений: 31,540
Записей в блоге: 2
25.08.2019, 23:47 17
Цитата Сообщение от EZhandrs Посмотреть сообщение
День разбирался в коде, но что-то понял
Время будет - сделаю ещё вариант на DataGrid
1
25.08.2019, 23:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2019, 23:47
Помогаю со студенческими работами здесь

WPF, MVVM, сложная логика контрола
Какие механизмы есть в WPF, чтобы оставаясь в рамках MVVM иметь возможность реализации сложной...

Помогите с версткой пожалуйста. Сложная таблица
Есть вот такой вот шаблон. ...

Производный класс Самоорганизующаяся таблица должен наследовать свойства и методы класса Таблица
класс таблица, содержащий целые числа Обьект класса таблица должен позволять: 1...

Сложная шапка datagridview
Здравствуйте. Мне нужно сделать шапку, как на фото снизу. Нашел один пример с отрисовкой, но какой...

Сложная структура и ее сортировка
1. Нужно создать структуру следующего вида: например:

Сложная составная форма
Здравствуйте! Создаю сложную составную форму. 1. Все части будут оформлены как таблицы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru