Программная привязка свойств кнопки к объекту индексатора - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь привязать свойства содержимого программно сгенерированных кнопок к объекту индексатора.Мой объект индексатора выглядит так:

internal class Indexer
{
    private int[,] cells;//values from 0 to gridSize^2

    public int this[int x, int y]
    {
        get { return cells[x, y]; }
    }

    public Indexer(int gridSize)
    {
        cells = new int[gridSize, gridSize];

        FillCells(gridSize);
    }

    private void FillCells(int size)
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cells[i, j] = i * size + j;
            }
        }
    }
}

Кнопки и привязки создаются внутри двух вложенных циклов и добавляются в единую сетку.В качестве теста я связал все свойства Button.Content с единичным свойством, подобным этому:

                Button myButton = new Button()
                mazeWindow.XAML_Grid.Children.Add(myButton);

                Binding myBinding = new Binding();
                myBinding.Source = this;
                myBinding.Path = new PropertyPath("GridSize");
                myButton.SetBinding(Button.ContentProperty, myBinding);

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

                myBinding.Source = this.indexerObject;
                myBinding.Path = new PropertyPath("Indexer",i,j);

Но это приводит к ошибке пути BindingExpression: свойство Indexerне найден в 'объекте' '' Индексатор '

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

Ответы [ 2 ]

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

Отвечая на мой собственный вопрос.Оказывается, в моем классе индексатора фактически отсутствовала строка:

    [IndexerName("SomeIndexerName")]
    public int this[int x, int y]
    {
        get { return cells[x, y]; }
    }

После этого я отбросил дополнительные параметры PropertyPath и просто использовал:

                myBinding.Source = this.indexerObject;
                myBinding.Path = new PropertyPath($"SomeIndexerName[{i},{j}]");  

И это сработало!

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

Вы должны указать индексы в строке пути, используя старый хороший форматировщик строки (интерполированная строка такая же хорошая):

for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10; j++)
    {
        var myButton = new Button();
        grid.Children.Add(myButton);
        myButton.SetValue(Grid.ColumnProperty, i);
        myButton.SetValue(Grid.RowProperty, j);
        Binding myBinding = new Binding($"GridSize[{i},{j}]") { Source = this };
        myButton.SetBinding(Button.ContentProperty, myBinding);
    }

Я использовал сетку 10x10, заполненную кнопками, добавляя соответствующее количество определений строки / столбцав xaml.

...