Как я могу решить эту проблему с помощью DataBInding?

В этом проекте я хочу создать пиксельную раскраску.

<ScrollViewer HorizontalScrollBarVisibility = "Auto"
              VerticalScrollBarVisibility = "Auto">
    <ItemsControl ItemsSource = "{Binding ColorMatrix}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl ItemsSource = "{Binding}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation = "Horizontal"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <pxl:Pixel 
                                Style = "{StaticResource Pixel}"
                                PrimaryColor = "{Binding Converter = {StaticResource ColorConverter}}"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>

ColoringBookView.xaml

Это просто вид массива Color[][].

ColorMatrix — это тип Color[][]

public class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is System.Drawing.Color drawingColor)
        {
            return Color.FromArgb(drawingColor.A, drawingColor.R, drawingColor.G, drawingColor.B);
        }
        return Colors.Black; 
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

ColoreConverter.cs

public class Pixel : CheckBox
{
    public static readonly DependencyProperty PrimaryColorProperty = DependencyProperty.Register("PrimaryColor", typeof(Color), typeof(Pixel));
    public static readonly DependencyProperty AccentColorProperty = DependencyProperty.Register("AccentColor", typeof(Color), typeof(Pixel));
    public static readonly DependencyProperty IsDrawedProperty = DependencyProperty.Register("IsDrawed", typeof(bool), typeof(Pixel));

    public Color PrimaryColor
    {
        get { return (Color)GetValue(PrimaryColorProperty); }
        set { SetValue(PrimaryColorProperty, value); }
    }
    public Color AccentColor
    {
        get { return (Color)GetValue(AccentColorProperty); }
        set { SetValue(AccentColorProperty, value); }
    }
    public bool IsDrawed
    {
        get { return (bool)GetValue(IsDrawedProperty); }
        set { SetValue(IsDrawedProperty, value); }
    }
}

Pixel.cs

Это CustomControl для WPF.

<ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:pxl = "clr-namespace:PXL.Core.Theme"
                    xmlns:converters = "clr-namespace:PXL.Core.Converters">

    <Style TargetType = "{x:Type pxl:Pixel}" x:Key = "Pixel">
        <Setter Property = "Template">
            <Setter.Value>
                <ControlTemplate TargetType = "{x:Type pxl:Pixel}">
                    <Grid>
                        <Rectangle Height = "30" Width = "30">
                            <Rectangle.Fill>
                                <SolidColorBrush Color = "{TemplateBinding PrimaryColor}"/>
                            </Rectangle.Fill>
                        </Rectangle>
                        <TextBlock Text = "Pixel" Background = "{TemplateBinding PrimaryColor}" Foreground = "{TemplateBinding PrimaryColor}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

Pixel.xaml

У меня проблемы с привязкой данных, но я не понимаю, в чем дело.

TextBlock.Background и TextBlock.Foreground в Pixel.xaml не изменяются.

Вы должны обернуть ItemsPresenterControlTemplate в ScrollViewer, а не в полный ItemsControl (это приводит к другому поведению прокрутки — вы хотите прокручивать содержимое или элементы элемента управления, а не сам элемент управления). Вместо этого я рекомендую использовать ListBox: это расширенный ItemsControl, который включает в себя средство просмотра прокрутки и другие улучшения производительности. Из соображений производительности вам также не следует привязываться к массиву. Вместо этого привяжите ObservableCollection.

BionicCode 26.02.2024 14:04

Атрибуты цвета TextBlock не изменятся, поскольку нет ничего, что могло бы вызвать их изменение. Ожидаете ли вы, что они будут динамично меняться? Ваш ColorConverter всегда возвращает черный цвет (я предполагаю, что вы не используете System.Drawing.Color в своем коде — не следует).

BionicCode 26.02.2024 14:06
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Свойствам Background и ForegroundTextBlock можно установить только значения System.Windows.Media.Brush.

Вы не можете привязать их к System.Windows.Media.Color или System.Drawing.Color.

Я добавил конвертер из System.Windows.Media.Color в System.Windows.Media.Brush, но это ничего не меняет. Прямоугольник всегда прозрачный.

Artsiom Andros 27.02.2024 14:46

Конвертер? Вам следует изменить тип ваших свойств.

mm8 08.03.2024 14:27

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