Привязка DataGridTemplateColumn в UserControl.Resources

В настоящее время я пытаюсь написать небольшую программу календаря в С# WPF. Для datagrid я написал userControl. Это работает так, как я хочу, чтобы это работало. Мне все еще нужно будет обновить оптику, но пока это хорошо.

Проблема в коде DataGridTextColums. Все это избыточно. Поэтому, если я хочу что-то изменить, мне нужно изменить это везде.

            <DataGrid x:Name = "datagrid"
          CanUserAddRows = "False"
          CanUserDeleteRows = "False"
          CanUserResizeColumns = "False"
          CanUserReorderColumns = "False"
          CanUserResizeRows = "False"
          CanUserSortColumns = "False"
          AutoGenerateColumns = "False" 
          SelectionUnit = "Cell"
          SelectionMode = "Extended"
          HeadersVisibility = "Column"
          Background = "Transparent"
          BorderBrush = "Transparent"
          ItemsSource = "{Binding DataGridSource.DataGridList, RelativeSource = {RelativeSource AncestorType=UserControl}}">
        <DataGrid.Columns>

            <DataGridTextColumn Header = "CW" Width = "*" IsReadOnly = "True" Binding = "{Binding CwCell.Text}">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType = "{x:Type DataGridCell}">
                        <Setter Property = "Background" Value = "{Binding CwCell.BackColor}"/>
                        <Setter Property = "BorderBrush" Value = "{Binding CwCell.BorderColor}"/>
                        <Style.Triggers>
                            <Trigger Property = "IsSelected" Value = "True">
                                <Setter Property = "Foreground" Value = "Black"/>
                                <Setter Property = "BorderBrush" Value = "OrangeRed"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>

            <DataGridTemplateColumn Header = "MO" Width = "*" IsReadOnly = "True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Border>
                            <StackPanel Orientation = "Horizontal" Background = "Transparent">
                                <TextBlock Text = "{Binding MondayCell.Text}" Margin = "5,0,0,0" Width = "18"/>
                                <ItemsControl ItemsSource = "{Binding Path=MondayCell.Addons}" Margin = "0,0,7,0">
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <WrapPanel Orientation = "Vertical" MaxHeight = "20"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <Ellipse Width = "4" Height = "4" Margin = "0,1,1,1" Fill = "{Binding Color}"/>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </StackPanel>
                        </Border>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellStyle>
                    <Style TargetType = "{x:Type DataGridCell}">
                        <Setter Property = "Background" Value = "{Binding MondayCell.BackColor}"/>
                        <Setter Property = "BorderBrush" Value = "{Binding MondayCell.BorderColor}"/>
                        <Setter Property = "ToolTip">
                            <Setter.Value>
                                <ToolTip BorderThickness = "0" Background = "Transparent">
                                    <Grid>
                                        <Border Background = "White" BorderBrush = "Black" BorderThickness = "1">
                                            <StackPanel Orientation = "Vertical" DataContext = "{Binding MondayCell}">
                                                <TextBlock Text = "{Binding AppointmentName}" 
                                                           Background = "White" Width = "auto" Margin = "5,5,5,1"
                                                           TextWrapping = "Wrap"
                                                           FontWeight = "Bold"/>
                                                <Border BorderBrush = "Silver" BorderThickness = "0,1,0,0" Margin = "0,1,0,0" />
                                                <TextBlock Text = "{Binding AppointmentDescr}" 
                                                           Background = "White" Margin = "5,1,5,5"
                                                           TextWrapping = "Wrap"/>
                                                <Border BorderBrush = "Silver" BorderThickness = "0,1,0,0" Margin = "0,1,0,0" />
                                                <ItemsControl ItemsSource = "{Binding Path=Addons}" Margin = "0,0,7,0">
                                                    <ItemsControl.ItemsPanel>
                                                        <ItemsPanelTemplate>
                                                            <StackPanel Orientation = "Vertical">
                                                            </StackPanel>
                                                        </ItemsPanelTemplate>
                                                    </ItemsControl.ItemsPanel>
                                                    <ItemsControl.ItemTemplate>
                                                        <DataTemplate>
                                                            <StackPanel Orientation = "Horizontal">
                                                                <Ellipse Width = "4" Height = "4" Fill = "{Binding Color}" Margin = "5,0,5,0"/>
                                                                <Border BorderBrush = "Silver" BorderThickness = "1,0,0,0" Margin = "0,0,0,0"/>
                                                                <TextBlock Text = "{Binding Name}" Margin = "5,0,0,0"/>
                                                            </StackPanel>
                                                        </DataTemplate>
                                                    </ItemsControl.ItemTemplate>
                                                </ItemsControl>
                                            </StackPanel>
                                        </Border>
                                    </Grid>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <Trigger Property = "IsSelected" Value = "True">
                                <Setter Property = "Foreground" Value = "Black"/>
                                <Setter Property = "BorderBrush" Value = "OrangeRed"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTemplateColumn.CellStyle>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Header = "DI" Width = "*" IsReadOnly = "True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Border>
                            <StackPanel Orientation = "Horizontal" Background = "Transparent">
                                <TextBlock Text = "{Binding TuesdayCell.Text}" Margin = "5,0,0,0" Width = "18"/>
                                <ItemsControl ItemsSource = "{Binding Path=TuesdayCell.Addons}" Margin = "0,0,7,0">
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <WrapPanel Orientation = "Vertical" MaxHeight = "20"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <Ellipse Width = "4" Height = "4" Margin = "0,1,1,1" Fill = "{Binding Color}"/>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </StackPanel>
                        </Border>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellStyle>
                    <Style TargetType = "{x:Type DataGridCell}">
                        <Setter Property = "Background" Value = "{Binding TuesdayCell.BackColor}"/>
                        <Setter Property = "BorderBrush" Value = "{Binding TuesdayCell.BorderColor}"/>
                        <Setter Property = "ToolTip">
                            <Setter.Value>
                                <ToolTip BorderThickness = "0" Background = "Transparent">
                                    <Grid>
                                        <Border Background = "White" BorderBrush = "Black" BorderThickness = "1">
                                            <StackPanel Orientation = "Vertical" DataContext = "{Binding TuesdayCell}">
                                                <TextBlock Text = "{Binding AppointmentName}" 
                                                           Background = "White" Width = "auto" Margin = "5,5,5,1"
                                                           TextWrapping = "Wrap"
                                                           FontWeight = "Bold"/>
                                                <Border BorderBrush = "Silver" BorderThickness = "0,1,0,0" Margin = "0,1,0,0" />
                                                <TextBlock Text = "{Binding AppointmentDescr}" 
                                                           Background = "White" Margin = "5,1,5,5"
                                                           TextWrapping = "Wrap"/>
                                                <Border BorderBrush = "Silver" BorderThickness = "0,1,0,0" Margin = "0,1,0,0" />
                                                <ItemsControl ItemsSource = "{Binding Path=Addons}" Margin = "0,0,7,0">
                                                    <ItemsControl.ItemsPanel>
                                                        <ItemsPanelTemplate>
                                                            <StackPanel Orientation = "Vertical">
                                                            </StackPanel>
                                                        </ItemsPanelTemplate>
                                                    </ItemsControl.ItemsPanel>
                                                    <ItemsControl.ItemTemplate>
                                                        <DataTemplate>
                                                            <StackPanel Orientation = "Horizontal">
                                                                <Ellipse Width = "4" Height = "4" Fill = "{Binding Color}" Margin = "5,0,5,0"/>
                                                                <Border BorderBrush = "Silver" BorderThickness = "1,0,0,0" Margin = "0,0,0,0"/>
                                                                <TextBlock Text = "{Binding Name}" Margin = "5,0,0,0"/>
                                                            </StackPanel>
                                                        </DataTemplate>
                                                    </ItemsControl.ItemTemplate>
                                                </ItemsControl>
                                            </StackPanel>
                                        </Border>
                                    </Grid>
                                </ToolTip>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <Trigger Property = "IsSelected" Value = "True">
                                <Setter Property = "Foreground" Value = "Black"/>
                                <Setter Property = "BorderBrush" Value = "OrangeRed"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DataGridTemplateColumn.CellStyle>
            </DataGridTemplateColumn>
           <!--same for wednesdayCell to sundayCell-->
        </DataGrid.Columns>
    </DataGrid>

Итак, как вы можете видеть, каждый DataGridTemplateColumn привязывается к другой ячейке (с понедельника по воскресенье).

Я попытался создать шаблон из этого. Если я сохраняю «MondayCell» в шаблоне (как в приведенном ниже коде), он работает. Но, очевидно, я не могу использовать какой-либо другой источник данных, кроме «MondayCell».

Видеть:

    <UserControl.Resources>
    <DataTemplate x:Key = "MyCellTemplate">
        <Border>
            <StackPanel Orientation = "Horizontal" Background = "Transparent">
                <TextBlock Text = "{Binding MondayCell.Text}" Margin = "5,0,0,0" Width = "18"/>
                <ItemsControl ItemsSource = "{Binding Path=MondayCell.Addons}" Margin = "0,0,7,0">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel Orientation = "Vertical" MaxHeight = "20"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Ellipse Width = "4" Height = "4" Margin = "0,1,1,1" Fill = "{Binding Color}"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </Border>
    </DataTemplate>

    <Style TargetType = "{x:Type DataGridCell}" x:Key = "MyCellStyle">
        <Setter Property = "Background" Value = "{Binding MondayCell.BackColor}"/>
        <Setter Property = "BorderBrush" Value = "{Binding MondayCell.BorderColor}"/>
        <Setter Property = "ToolTip">
            <Setter.Value>
                <ToolTip BorderThickness = "0" Background = "Transparent">
                    <Grid>
                        <Border Background = "White" BorderBrush = "Black" BorderThickness = "1">
                            <StackPanel Orientation = "Vertical" DataContext = "{Binding MondayCell}">
                                <TextBlock Text = "{Binding AppointmentName}" 
                                                           Background = "White" Width = "auto" Margin = "5,5,5,1"
                                                           TextWrapping = "Wrap"
                                                           FontWeight = "Bold"/>
                                <Border BorderBrush = "Silver" BorderThickness = "0,1,0,0" Margin = "0,1,0,0" />
                                <TextBlock Text = "{Binding AppointmentDescr}" 
                                                           Background = "White" Margin = "5,1,5,5"
                                                           TextWrapping = "Wrap"/>
                                <Border BorderBrush = "Silver" BorderThickness = "0,1,0,0" Margin = "0,1,0,0" />
                                <ItemsControl ItemsSource = "{Binding Path=Addons}" Margin = "0,0,7,0">
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation = "Vertical">
                                            </StackPanel>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation = "Horizontal">
                                                <Ellipse Width = "4" Height = "4" Fill = "{Binding Color}" Margin = "5,0,5,0"/>
                                                <Border BorderBrush = "Silver" BorderThickness = "1,0,0,0" Margin = "0,0,0,0"/>
                                                <TextBlock Text = "{Binding Name}" Margin = "5,0,0,0"/>
                                            </StackPanel>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </StackPanel>
                        </Border>
                    </Grid>
                </ToolTip>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property = "IsSelected" Value = "True">
                <Setter Property = "Foreground" Value = "Black"/>
                <Setter Property = "BorderBrush" Value = "OrangeRed"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

Использование в Datagrid: это работает, но показывает только данные из MondayCell.

                <DataGridTemplateColumn Header = "MO" Width = "*" IsReadOnly = "True">
                <DataGridTemplateColumn.CellTemplate>
                    <StaticResource ResourceKey = "MyCellTemplate"/>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellStyle>
                    <StaticResource ResourceKey = "MyCellStyle"/>
                </DataGridTemplateColumn.CellStyle>
            </DataGridTemplateColumn>

Как я хочу его использовать, но не работает так:

Любая помощь приветствуется. На данный момент я оставляю его избыточным, но я бы предпочел использовать шаблон, поэтому мне нужно изменить только 1 часть кода вместо 7.

Спасибо за помощь!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете динамически создавать свои столбцы, используя базовую строку из txt-файла, и использовать xamlreader.Parse или сохранять на диск, а затем использовать xamlreader.load.

Я отвечал на аналогичный вопрос некоторое время назад, но я не могу найти ответ.

Создайте шаблон в виде текстового файла с заполнителями для частей, которые вы хотите заменить. Вот пример, который я использую в образце, который я написал:

<?xml version = "1.0" encoding = "utf-8" ?>
<DataGridTemplateColumn>
    <DataGridTemplateColumn.Header>
    <Grid>
        <Grid.RowDefinitions>
        <RowDefinition Height = "*" />
        <RowDefinition Height = "*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
        <ColumnDefinition Width = "*"/>
        <ColumnDefinition Width = "*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Text = "xxMMMxx" TextAlignment = "Center" Grid.ColumnSpan = "2"/>
        <TextBlock Text = "Units" Margin = "2,0,2,0" Grid.Row = "1"/>
        <TextBlock Text = "Value" Margin = "2,0,2,0" Grid.Row = "1" Grid.Column = "2" />
    </Grid>
    </DataGridTemplateColumn.Header>
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width = "*"/>
            <ColumnDefinition Width = "*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Text = "{Binding MonthTotals[xxNumxx].Products}" Margin = "2,0,2,0" TextAlignment = "Right"/>
        <TextBlock Text = "{Binding MonthTotals[xxNumxx].Total}"    Margin = "2,0,2,0" TextAlignment = "Right" Grid.Column = "1"/>
        </Grid>
    </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Сделайте этот контент, скопируйте, если он новее, и вы получите текстовый файл рядом с вашим exe, который вы можете прочитать.

В этом у меня есть динамическая сетка данных как еще один текстовый файл, но это не совсем необходимо.

Вот мой код строит и добавляет столбцы.

Вы можете просто работать с текстовым файлом как со строкой и выполнять подстановку строк. Это показывает, как манипулировать им как xml, который позволяет вам вставлять xelements и т. д. Он устанавливает атрибуты, в то время как вы, возможно, можете забыть об этой части и просто выполнить замену строки, xamlreader.parse в столбец datagrid и добавить в коллекцию столбцов.

Он заменяет номера месяцев в привязке на диапазон месяцев.

Если вы рассматриваете скользящий финансовый отчет за последние n месяцев, это общая идея. В прошлом месяце было бы 3 сейчас в апреле. 4 когда вы бежите в мае.

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Get the datagrid shell
        XElement xdg = GetXElement(@"pack://application:,,,/dg.txt");  
        XElement cols = xdg.Descendants().First();     // Column list
        // Get the column template
        XElement col = GetXElement(@"pack://application:,,,/col.txt");  

        DateTime mnth = DateTime.Now.AddMonths(-6);

        for (int i = 0; i < 6; i++)
        {
            DateTime dat = mnth.AddMonths(i);
            XElement el = new XElement(col);
            // Month in mmm format in header
            var mnthEl = el.Descendants("TextBlock")
                        .Single(x => x.Attribute("Text").Value.ToString() == "xxMMMxx");
            mnthEl.SetAttributeValue("Text", dat.ToString("MMM"));

            string monthNo = dat.AddMonths(-1).Month.ToString();
            // Month as index for the product
            var prodEl = el.Descendants("TextBlock")
                        .Single(x => x.Attribute("Text").Value == "{Binding MonthTotals[xxNumxx].Products}");
            prodEl.SetAttributeValue("Text",
                "{Binding MonthTotals[" + monthNo + "].Products}");
            // Month as index for the total
            var prodTot = el.Descendants("TextBlock")
                        .Single(x => x.Attribute("Text").Value == "{Binding MonthTotals[xxNumxx].Total}");
            prodTot.SetAttributeValue("Text",
                "{Binding MonthTotals[" + monthNo + "].Total}");
            cols.Add(el);
        }

        string dgString = xdg.ToString();
        ParserContext context = new ParserContext();
        context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
        context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
        DataGrid dg = (DataGrid)XamlReader.Parse(dgString, context);
        Root.Children.Add(dg);
    }
    private XElement GetXElement(string uri)
    {
        XDocument xmlDoc = new XDocument();
        var xmltxt = Application.GetContentStream(new Uri(uri));
        string elfull = new StreamReader(xmltxt.Stream).ReadToEnd();
        xmlDoc = XDocument.Parse(elfull);
        return xmlDoc.Root;
    }
}

Используя такой подход, вы потенциально можете построить свой годовой обзор. Создайте его как xml или строку. Сохранить на диск. xamlreader.load() вернет его обратно, чтобы управлять диском.

Аналогичным подходом, основанным на манипуляциях со строками, было бы создание элемента управления в виде текста. Сохраните как шаблон данных в словаре ресурсов. Затем вы можете загрузить такой нескомпилированный словарь ресурсов с диска и просто собирать его раз в год. Вы можете централизованно создать небольшое служебное приложение, предназначенное только для этой цели, и распространять его среди клиентов.

Спасибо за ответ. Но я думаю, что для моего типа проекта это немного избыточно. Я пытаюсь сохранить все это в xaml.

kpischi 06.02.2023 13:55
Ответ принят как подходящий

Я хотел бы представить решение, основанное на использовании UserControl:

                <DataGridTemplateColumn >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <local:StandardColumn Column = "{Binding MondayCell}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <local:StandardColumn Column = "{Binding TuesdayCell}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

Реализация StandardColumn для простоты может быть следующей:

<UserControl x:Class = "Problem8.StandardColumn"
             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:Problem8"
             mc:Ignorable = "d" 
             d:DesignHeight = "450" d:DesignWidth = "800" Name = "Parent">
    <StackPanel>
        <TextBlock Text = "{Binding ElementName=Parent,Path=Column}"/>
    </StackPanel>
</UserControl>

В этом userControl у нас есть свойство зависимостей, называемое Column :

public partial class StandardColumn : UserControl
    {
        public StandardColumn()
        {
            InitializeComponent();
        }
        public static readonly DependencyProperty ColumnProperty =
         DependencyProperty.Register("Column", typeof(object), typeof(StandardColumn));

        public object Column
        {
            get { return (object)GetValue(ColumnProperty); }
            set { SetValue(ColumnProperty, value); }
        }
    }

Мы также можем сделать это еще проще, используя DataContext вместо свойства зависимости Column.

Могу ли я также создать пользовательский элемент управления для Cellstyle? CellTemplate теперь работает, но, похоже, я не могу привязать Cellstyle. Я создаю другой пользовательский элемент управления только со стилем.

kpischi 06.02.2023 14:20

Что касается запроса CellStyle - мне кажется, что вы все еще можете использовать CellSTyle для свойств Cell, таких как Background и Tooltip . Можете ли вы указать конкретное препятствие, где решение блокирует вас?

Gilad Waisel 06.02.2023 17:30

привязка шаблона ячейки работает так, как вы предложили: <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ucc:DataGridColT DataCellSource = "{Binding MondayCell}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn. CellStyle> <????> </DataGridTemplateColumn.CellStyle> </DataGridTemplateColumn> Но как привязать стиль ячейки? Я создал пользовательский элемент управления для своего стиля ячейки, но не знаю, как к нему привязаться. <UserControl ...> <UserControl.Resources> <Style x:Key = "DataGridColStyle" TargetType = "{x:Type DataGridCell}">

kpischi 06.02.2023 20:44

Это мое второе решение. Я считаю, что выбор DataGrid в качестве основы создал эту сложность. В качестве альтернативы мы можем рассмотреть более простые элементы управления. Готовлю решение: Пользовательский элемент управления MonthView может выглядеть следующим образом:

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height = "Auto"/>
            <RowDefinition Height = "Auto"/>
        </Grid.RowDefinitions>
        <local:HeaderView Grid.Row = "0"/>
        <ItemsControl ItemsSource = "{Binding Weeks}" Grid.Row = "1" >
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <local:WeekView/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

Пользовательский элемент управления WeekView может выглядеть следующим образом:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
        </Grid.ColumnDefinitions>
        <local:DayView DataContext = "{Binding CwCell}" Grid.Column = "0"/>
        <local:DayView DataContext = "{Binding MondayCell}" Grid.Column = "1"/>
        <local:DayView DataContext = "{Binding TuesdayCell}" Grid.Column = "2"/>
        <local:DayView DataContext = "{Binding WednesdayCell}" Grid.Column = "3"/>
        <local:DayView DataContext = "{Binding ThursdayCell}" Grid.Column = "4"/>
        <local:DayView DataContext = "{Binding FridayCell}" Grid.Column = "5"/>
        <local:DayView DataContext = "{Binding FridayCell}" Grid.Column = "6"/>
        <local:DayView DataContext = "{Binding SaturdayCell}" Grid.Column = "7"/>
        <local:DayView DataContext = "{Binding SundayCell}" Grid.Column = "8"/>
    </Grid>

Пользовательский элемент управления DayView может выглядеть следующим образом:

<Border BorderBrush = "Black" BorderThickness = "1">
        <TextBlock Text = "{Binding Text}" Width = "20" Height = "20" VerticalAlignment = "Center" HorizontalAlignment = "Center"/>
    </Border>

Пользовательский элемент управления HeaderView может выглядеть следующим образом:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
            <ColumnDefinition Width = "Auto"/>
        </Grid.ColumnDefinitions>
        <local:ColumnHeaderView DataContext = "CW" Grid.Column = "0" />
        <local:ColumnHeaderView DataContext = "MO" Grid.Column = "1" />
        <local:ColumnHeaderView DataContext = "TU" Grid.Column = "2" />
        <local:ColumnHeaderView DataContext = "WE" Grid.Column = "3" />
        <local:ColumnHeaderView DataContext = "TH" Grid.Column = "4" />
        <local:ColumnHeaderView DataContext = "FR" Grid.Column = "5" />
        <local:ColumnHeaderView DataContext = "SA" Grid.Column = "6" />
        <local:ColumnHeaderView DataContext = "SU" Grid.Column = "7" />
    </Grid>

Пользовательский элемент управления ColumnHeaderView может выглядеть следующим образом:

<Border BorderBrush = "Black" BorderThickness = "1">
            <TextBlock Text = "{Binding }" Width = "20" Height = "15" VerticalAlignment = "Center" HorizontalAlignment = "Center"/>
        </Border>

это звучит даже лучше, чем использование Datagrid. Я попробую это. Спасибо!

kpischi 08.02.2023 18:35

Другие вопросы по теме