为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

精慕HU 2019-08-01 17:31:49
如何基于二维数组填充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);         }     }}
查看完整描述

4 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

Grid的目的不是用于真正的数据绑定,它只是一个面板。我列出了完成二维列表可视化的最简单方法

<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数据结构设置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以添加对象的更多特定数据。


查看完整回答
反对 回复 2019-08-01
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

我写了一个小的附加属性库DataGrid。 这是来源

示例,其中Data2D是int[,]

<DataGrid HeadersVisibility="None"
          dataGrid2D:Source2D.ItemsSource2D="{Binding Data2D}" />


查看完整回答
反对 回复 2019-08-01
?
皈依舞

TA贡献1851条经验 获得超3个赞

不需要AutoGeneratingColumn在每个绑定的代码后面都有一个事件处理程序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;}


查看完整回答
反对 回复 2019-08-01
  • 4 回答
  • 0 关注
  • 949 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信