因此,我正在为网格动态创建按钮。我有两个窗口 - 一个用于一名玩家,第二个用于第二名玩家。我想使用数据绑定将每个播放器按钮切换到使用颜色类的第二个播放器板。
我尝试将每个创建的按钮绑定到背景属性,在我的 ViewModel 中我有 2 个 ObservableCollection 对象,所以当我单击某个播放器按钮时它应该改变颜色,但它不起作用。我的窗口中有数据上下文,它看起来像这样:
MainGrid.DataContext = playerShip;
for (int row = 1; row < 11; row++) //i start with 1 because on the 0 number there is my fields names, this field is for setting ships. Enemy method looks the same.
{
for (int col = 1; col < 11; col++)
{
Button button = new Button();
button.Name = $"button_{row}_{col}";
button.Tag = tagNum++;
button.SetBinding(BackgroundProperty, new Binding($"PlayerOne[{row}][{col}]");
button.BorderBrush = Brushes.DarkSlateBlue;
button.Click += AddShips;
Grid.SetRow(button, row);
Grid.SetColumn(button, col);
MainGrid.Children.Add(button);
}
}
tagNum = 0;
for (int row = 1; row < 11; row++) //this is for "aiming" for a ship
{
for (int col = 13; col < 23; col++)
{
Button button = new Button();
button.Name = $"button_{row}_{col}";
button.Tag = tagNum++;
button.Content = tagNum;
button.SetBinding(BackgroundProperty, new Binding($"PlayerTwo[{row}][{col}]");
button.BorderBrush = Brushes.DarkSlateBlue;
button.Click += HitShips;
Grid.SetRow(button, row);
Grid.SetColumn(button, col);
MainGrid.Children.Add(button);
}
}
你能向我解释一下我的推理哪里有错误吗?
在您的代码中,我没有看到任何对行或列定义的引用。您可能看不到按钮,因为它们彼此重叠。您可以像这样添加行和列定义:
MyGrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto});
MyGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
行和列定义使用 GridLength 测量,该测量支持不同类型的单位,具体取决于您想要布局网格的方式。您可以在这里找到更多信息: https://learn.microsoft.com/en-us/dotnet/api/system.windows.gridlength?view=windowsdesktop-7.0#remarks