将矩阵数组绑定到 WPF DataGrid。

4

我有3个这样的字符串数组:

public string[] RowHeaders
{
    get { return new[] {"RowHeader1", "RowHeader2", "RowHeader3", "RowHeader4"}; 
}

public string[] ColumnHeaders
{
    get { return new[] {"ColumnHeader1", "ColumnHeader2", "ColumnHeader3"}; }
}

public string[][] Values
{
    get { return new[]
    {
        new []{"Value11", "Value12", "Value13"},
        new []{"Value21", "Value22", "Value23"},
        new []{"Value31", "Value32", "Value33"},
        new []{"Value41", "Value42", "Value43"},
    }; }
}

数组大小在运行时是未知的(代码片段中的数组值仅用于展示概念)。我想根据它们创建一个 WPF 网格。

Grid with array data

如何将其绑定到这3个数组,并完全使用XAML设计(如果可能)?


创建一个名为newGridControl的控件,它继承自Grid,并在其中放置3个DependencyProperties:ColumnHeader、RowHeader和ItemsSource,并使用代码自动生成它们。 - safi
@safi,好主意。谢谢你。我正在努力工作。 - Naser Asadi
1个回答

6

以下是使用 DataTable 和 MultipleBinding 的解决方案, 在 xaml 中,将三个数组传递给 IMultivaluesConverter:

<Grid>
   <DataGrid>
        <DataGrid.ItemsSource>
            <MultiBinding Converter="{StaticResource MatrixToDataViewConverter}">
                <Binding Path="ColumnHeaders"/>
                <Binding Path="RowHeaders"/>
                <Binding Path="Values"/>
            </MultiBinding>
        </DataGrid.ItemsSource>
    </DataGrid>
</Grid>

然后在转换器中管理这些数组,创建一个DataView,将其绑定到网格项源:

 public class MatrixToDataViewConverter:IMultiValueConverter
{            
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var myDataTable = new DataTable();
        var colums = values[0] as string[];
        var rows = values[1] as string[];
        var vals = values[2] as string[][];
        myDataTable.Columns.Add("---");    //The blanc corner column
        foreach (var value in colums)
        {
            myDataTable.Columns.Add(value);
        }
        int index = 0;

        foreach (string row in rows)
        {
            var tmp = new string[1 + vals[index].Count()];                
            vals[index].CopyTo(tmp, 1);
            tmp[0] = row;
            myDataTable.Rows.Add(tmp);
            index++;
        }     
        return myDataTable.DefaultView;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

输出: 输入图片描述

谢谢,好的解决方案。你有没有想法如何使行标题的样式与列标题相同并删除最后一个空白行? - Naser Asadi
要删除最后一行的空白行,只需设置 CanUserAddRows:<DataGrid CanUserAddRows="False">..至于第一行列的样式,我不确定,但可以尝试设置 DataGridRowHeader 样式。 - SamTh3D3v
我该如何使用相同的方法更新单元格背景颜色? - rollsch
快速问题:如果在运行时调用某个方法更改了值2D数组,那么值的视图是否会发生变化?谢谢! - Mikhail T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接