以编程方式将按钮属性绑定到索引器对象

时间:2018-12-17 12:42:42

标签: c# binding indexer

我试图将以编程方式生成的按钮的内容属性绑定到索引器对象。 我的索引器对象如下所示:

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;
            }
        }
    }
}

按钮和绑定在两个嵌套的for循环内创建,并添加到统一的网格中。 作为测试,我将所有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路径错误:在“对象”“索引器”上找不到“索引器”属性

我认为索引器中肯定有一些我不了解的东西(以前从未使用过它们),否则我解决此问题的方法存在某种缺陷。

2 个答案:

答案 0 :(得分:0)

您必须使用旧的良好字符串格式化程序(内插字符串相同的良好格式)在路径字符串中指定索引:

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中添加了相应数量的行/列定义。

答案 1 :(得分:0)

回答我自己的问题。 原来我的索引器类实际上缺少一行:

    [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}]");  

成功了!