如何基于二維數(shù)組填充WPF網(wǎng)格我有一個(gè)二維的對象數(shù)組,我基本上想要將每個(gè)對象數(shù)據(jù)綁定到WPF網(wǎng)格中的單元格。目前我有這個(gè)工作,但我在程序上做了大部分工作。我創(chuàng)建了正確數(shù)量的行和列定義,然后循環(huán)遍歷單元格并創(chuàng)建控件并為每個(gè)控件設(shè)置正確的綁定。至少我希望能夠使用模板來指定xaml中的控件和綁定。理想情況下,我想擺脫程序代碼,并使用數(shù)據(jù)綁定完成所有操作,但我不確定這是否可能。這是我目前使用的代碼:public void BindGrid(){
m_Grid.Children.Clear();
m_Grid.ColumnDefinitions.Clear();
m_Grid.RowDefinitions.Clear();
for (int x = 0; x < MefGrid.Width; x++)
{
m_Grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star), });
}
for (int y = 0; y < MefGrid.Height; y++)
{
m_Grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star), });
}
for (int x = 0; x < MefGrid.Width; x++)
{
for (int y = 0; y < MefGrid.Height; y++)
{
Cell cell = (Cell)MefGrid[x, y];
SolidColorBrush brush = new SolidColorBrush();
var binding = new Binding("On");
binding.Converter = new BoolColorConverter();
binding.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(brush, SolidColorBrush.ColorProperty, binding);
var rect = new Rectangle();
rect.DataContext = cell;
rect.Fill = brush;
rect.SetValue(Grid.RowProperty, y);
rect.SetValue(Grid.ColumnProperty, x);
m_Grid.Children.Add(rect);
}
}}
4 回答

慕容3067478
TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
Grid的目的不是用于真正的數(shù)據(jù)綁定,它只是一個(gè)面板。我列出了完成二維列表可視化的最簡單方法
<Window.Resources> <DataTemplate x:Key="DataTemplate_Level2"> <Button Content="{Binding}" Height="40" Width="50" Margin="4,4,4,4"/> </DataTemplate> <DataTemplate x:Key="DataTemplate_Level1"> <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate_Level2}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl> </DataTemplate></Window.Resources><Grid> <ItemsControl x:Name="lst" ItemTemplate="{DynamicResource DataTemplate_Level1}"/></Grid>
在后面的代碼中,使用TwoDimentional數(shù)據(jù)結(jié)構(gòu)設(shè)置lst的ItemsSource。
public Window1() { List<List<int>> lsts = new List<List<int>>(); for (int i = 0; i < 5; i++) { lsts.Add(new List<int>()); for (int j = 0; j < 5; j++) { lsts[i].Add(i * 10 + j); } } InitializeComponent(); lst.ItemsSource = lsts; }
這將為您提供以下屏幕作為輸出。您可以編輯DataTemplate_Level2以添加對象的更多特定數(shù)據(jù)。

皈依舞
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
不需要AutoGeneratingColumn
在每個(gè)綁定的代碼后面都有一個(gè)事件處理程序DataGrid
:
public static DataView GetBindable2DArray<T>(T[,] array){ var table = new DataTable(); for (var i = 0; i < array.GetLength(1); i++) { table.Columns.Add(i+1, typeof(bool)) .ExtendedProperties.Add("idx", i); // Save original column index } for (var i = 0; i < array.GetLength(0); i++) { table.Rows.Add(table.NewRow()); } var view = new DataView(table); for (var ri = 0; ri < array.GetLength(0); ri++) { for (var ci = 0; ci < array.GetLength(1); ci++) { view[ri][ci] = array[ri, ci]; } } // Avoids writing an 'AutogeneratingColumn' handler table.ColumnChanged += (s, e) => { var ci = (int)e.Column.ExtendedProperties["idx"]; // Retrieve original column index var ri = e.Row.Table.Rows.IndexOf(e.Row); // Retrieve row index array[ri, ci] = (T)view[ri][ci]; }; return view;}
- 4 回答
- 0 關(guān)注
- 985 瀏覽
添加回答
舉報(bào)
0/150
提交
取消