【发布时间】:2017-11-02 22:17:01
【问题描述】:
我正在使用 WPF 创建一个国际象棋游戏。我需要获取所选单元格(行/列)的索引。
XAML:
<DataGrid Name ="chessGrid"
AutoGenerateColumns="False"
HeadersVisibility="None"
SelectionMode="Single"
SelectionUnit="Cell"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
CurrentCellChanged="chessGrid_CurrentCellChanged"
SelectionChanged="chessGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Width="*" Binding="{Binding columns[0]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[1]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[2]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[3]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[4]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[5]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[6]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[7]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[8]}" />
<DataGridTextColumn Width="*" Binding="{Binding columns[9]}" />
</DataGrid.Columns>
当单元格发生变化时,我会调用:
private void chessGrid_CurrentCellChanged(object sender, System.EventArgs e)
{
x = chessGrid.CurrentCell.Column.DisplayIndex;
Debug.WriteLine(x);
}
这允许我获取单元格的列索引。
我目前正在尝试:
private void chessGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
y = chessGrid.SelectedIndex;
Debug.WriteLine(y);
}
获取行。但这不起作用,当删除 SelectionUnit="Cell" 时,上述工作,但我当然不能这样做,因为你不应该能够选择一整行。我也试过了:
private void chessGrid_CurrentCellChanged(object sender, System.EventArgs e)
{
x = chessGrid.CurrentCell.Column.DisplayIndex;
y = chessGrid.Items.IndexOf(chessGrid.CurrentCell)
Debug.WriteLine(x);
}
哪个设置 y 为 -1?
所以我的问题是如何使用简单的 WPF 和数据网格获取所选单元格的行/列索引?
编辑:一个要求是应用程序应该使用三层架构。
【问题讨论】:
-
你做错了。阅读有关绑定和 MVVM 的信息。
-
@KostyaK 我忘了提到应用程序必须使用三层架构编写,我认为 MVVM 不兼容,但我读了一遍,谢谢。
-
@Tagor 如果您的意思是单独的数据访问、业务逻辑和表示层,请使用 MVVM。以任何其他方式使用 WPF 既痛苦又困难。