我试图将以编程方式生成的按钮的内容属性绑定到索引器对象。 我的索引器对象如下所示:
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路径错误:在“对象”“索引器”上找不到“索引器”属性
我认为索引器中肯定有一些我不了解的东西(以前从未使用过它们),否则我解决此问题的方法存在某种缺陷。
答案 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}]");
成功了!