Связывание WPF без XAML - PullRequest
       21

Связывание WPF без XAML

0 голосов
/ 11 декабря 2018

У меня есть приложение WPF с «окном сетки».В этом окне нет добавленного XAML.Я создаю сетку (столбцы и строки), затем помещаю прямоугольник в каждый из них в C #.Это позволяет мне создавать сетку, в которой я устанавливаю «Штрих», и отображать местоположения на сетке, когда я устанавливаю «Заполнение».

Вся сетка установлена ​​одинаково, другими словами, если одна часть сетки красная, вся сетка красная.В настоящее время я устанавливаю сетку, перебирая все прямоугольники и устанавливая свойство 'Stroke'.Это прекрасно работает, но кажется очень медленным по сравнению с большинством других операций.Я хотел бы связать свойство stroke с переменной в C # (если итерация не является разумным способом справиться с этим).

Я рассмотрел довольно много вопросов здесь, но большинство хочет использовать XAML.Мой код ниже основан на Binding без XAML [WPF] .Нет ошибок, сетка просто никогда не появляется.

    // put a rectangle in each square
    for (int i = 0; i < x; i++) // for each column
    {
        for (int j = 0; j < y; j++) // for each row
        {
            // create a new rectangle with name, height, width, and starting color (transparent)
            var rect = new Rectangle()
            {
                Name = $"rec{(i + 1).ToString("00")}{(j + 1).ToString("00")}", //column 5 row 2 -> rec0502
                Height = squareSize,
                Width = squareSize,
                Fill = _ColorOff
            };

            // create the binding
            var binder = new Binding
            {
                Source = _GridColor, // Brush that is updated on color change
                Path = new PropertyPath("Stroke")
            };

            // apply the binding to the rectangle
            rect.SetBinding(Rectangle.StrokeProperty, binder);
            rect.DataContext = binder;

            // place the rectangle
            Grid.SetColumn(rect, i);         // current column
            Grid.SetRow(rect, (y - j - 1));  // same row but from the bottom (puts point 0,0 at bottom left)

            // add the rectangle to the grid
            grdBattleGrid.Children.Add(rect);
        }
    }

Даже если итерация в порядке, я все равно хотел бы знать, что я делаю неправильно.

РЕДАКТИРОВАТЬ: Имя цветавыбирается из ComboBox в отдельном окне.Это обновляет пользовательские настройки, которые, в свою очередь, генерируют событие, на которое подписано мое «окно сетки».Я преобразую имя в SolidColorBrush перед итерацией по прямоугольникам.

1 Ответ

0 голосов
/ 11 декабря 2018

Самое простое решение - вообще не иметь привязки.Назначьте _GridColor Инсульту прямоугольника.Всякий раз, когда свойство Color (предполагаемого SolidColorBrush) _GridColor изменяется, оно влияет на все прямоугольники.

public SolidColorBrush _GridColor { get; } = new SolidColorBrush(); 
...

var rect = new Rectangle
{
    Name = $"rec{(i + 1).ToString("00")}{(j + 1).ToString("00")}",
    Height = squareSize,
    Width = squareSize,
    Fill = _ColorOff,
    Stroke = _GridColor // here
};

Grid.SetColumn(rect, i);
Grid.SetRow(rect, (y - j - 1));
grdBattleGrid.Children.Add(rect);

Измените обводку прямоугольника, присвоив значение свойству Color _GridColor Brush:

_GridColor.Color = Colors.Red;
...