如何基于二维数组填充WPF网格

如何基于二维数组填充WPF网格

我有一个二维的对象数组,我基本上想要将每个对象数据绑定到WPF网格中的单元格。目前我有这个工作,但我在程序上做了大部分工作。我创建了正确数量的行和列定义,然后循环遍历单元格并创建控件并为每个控件设置正确的绑定。

至少我希望能够使用模板来指定xaml中的控件和绑定。理想情况下,我想摆脱程序代码,并使用数据绑定完成所有操作,但我不确定这是否可能。

这是我目前使用的代码:

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


精慕HU
浏览 950回答 4
4回答

慕容3067478

Grid的目的不是用于真正的数据绑定,它只是一个面板。我列出了完成二维列表可视化的最简单方法<Window.Resources> &nbsp;&nbsp;&nbsp;&nbsp;<DataTemplate&nbsp;x:Key="DataTemplate_Level2"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<Button&nbsp;Content="{Binding}"&nbsp;Height="40"&nbsp;Width="50"&nbsp;Margin="4,4,4,4"/> &nbsp;&nbsp;&nbsp;&nbsp;</DataTemplate> &nbsp;&nbsp;&nbsp;&nbsp;<DataTemplate&nbsp;x:Key="DataTemplate_Level1"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ItemsControl&nbsp;ItemsSource="{Binding}"&nbsp;ItemTemplate="{DynamicResource&nbsp;DataTemplate_Level2}"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ItemsControl.ItemsPanel> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<ItemsPanelTemplate> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<StackPanel&nbsp;Orientation="Horizontal"/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ItemsPanelTemplate> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ItemsControl.ItemsPanel> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</ItemsControl> &nbsp;&nbsp;&nbsp;&nbsp;</DataTemplate></Window.Resources><Grid> &nbsp;&nbsp;&nbsp;&nbsp;<ItemsControl&nbsp;x:Name="lst"&nbsp;ItemTemplate="{DynamicResource&nbsp;DataTemplate_Level1}"/></Grid>在后面的代码中,使用TwoDimentional数据结构设置lst的ItemsSource。&nbsp;&nbsp;public&nbsp;Window1() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<List<int>>&nbsp;lsts&nbsp;=&nbsp;new&nbsp;List<List<int>>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;5;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lsts.Add(new&nbsp;List<int>()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;5;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lsts[i].Add(i&nbsp;*&nbsp;10&nbsp;+&nbsp;j); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lst.ItemsSource&nbsp;=&nbsp;lsts; &nbsp;&nbsp;&nbsp;&nbsp;}这将为您提供以下屏幕作为输出。您可以编辑DataTemplate_Level2以添加对象的更多特定数据。

繁花不似锦

我写了一个小的附加属性库DataGrid。&nbsp;这是来源示例,其中Data2D是int[,]:<DataGrid&nbsp;HeadersVisibility="None" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataGrid2D:Source2D.ItemsSource2D="{Binding&nbsp;Data2D}"&nbsp;/>

皈依舞

不需要AutoGeneratingColumn在每个绑定的代码后面都有一个事件处理程序DataGrid:public&nbsp;static&nbsp;DataView&nbsp;GetBindable2DArray<T>(T[,]&nbsp;array){ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;table&nbsp;=&nbsp;new&nbsp;DataTable(); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;array.GetLength(1);&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.Columns.Add(i+1,&nbsp;typeof(bool)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ExtendedProperties.Add("idx",&nbsp;i);&nbsp;//&nbsp;Save&nbsp;original&nbsp;column&nbsp;index &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;array.GetLength(0);&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.Rows.Add(table.NewRow()); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;view&nbsp;=&nbsp;new&nbsp;DataView(table); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;ri&nbsp;=&nbsp;0;&nbsp;ri&nbsp;<&nbsp;array.GetLength(0);&nbsp;ri++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;ci&nbsp;=&nbsp;0;&nbsp;ci&nbsp;<&nbsp;array.GetLength(1);&nbsp;ci++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view[ri][ci]&nbsp;=&nbsp;array[ri,&nbsp;ci]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Avoids&nbsp;writing&nbsp;an&nbsp;'AutogeneratingColumn'&nbsp;handler &nbsp;&nbsp;&nbsp;&nbsp;table.ColumnChanged&nbsp;+=&nbsp;(s,&nbsp;e)&nbsp;=>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;ci&nbsp;=&nbsp;(int)e.Column.ExtendedProperties["idx"];&nbsp;//&nbsp;Retrieve&nbsp;original&nbsp;column&nbsp;index &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;ri&nbsp;=&nbsp;e.Row.Table.Rows.IndexOf(e.Row);&nbsp;//&nbsp;Retrieve&nbsp;row&nbsp;index &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[ri,&nbsp;ci]&nbsp;=&nbsp;(T)view[ri][ci]; &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;view;}
打开App,查看更多内容
随时随地看视频慕课网APP