如何将一个二维布尔数组 bool[][] 绑定到 WPF DataGrid(单向)?

8

我有一个像这样的矩阵型数据网格。

enter image description here

这个网格完全是用XAML设计的。

现在如何使用二维数组向这些数据网格单元格中插入值? 需要插入的值必须是bool数据类型(TRUE或FALSE)。 有什么想法吗?


https://dev59.com/IXVC5IYBdhLWcg3wfhOL - Haris Hasan
1个回答

17

这是我在MVVM场景下的一种方法,使用一个转换器创建一个DataView,可以将其绑定到网格的ItemsSource。它适用于一种特殊的矩阵数据类型,其中包含双精度数值,但你可以根据自己的需求进行修改:

public class MatrixToDataViewConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var array = value as Matrix;
        if (array == null) return null;

        //var array = ILMath.rand(3, 5);

        var rows = array.Dimensions[0];
        var columns = array.Dimensions[1];

        var t = new DataTable();
        for (var c = 0; c < columns; c++)
        {
            t.Columns.Add(new DataColumn(c.ToString()));
        }

        for (var r = 0; r < rows; r++)
        {
            var newRow = t.NewRow();
            for (var c = 0; c < columns; c++)
            {
                var v = array[r, c];

                // Round if parameter is set
                if (parameter != null)
                {
                    int digits;
                    if (int.TryParse(parameter.ToString(), out digits))
                        v = Math.Round(v, digits);
                }

                newRow[c] = v;
            }

            t.Rows.Add(newRow);
        }


        return t.DefaultView;
    }

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

定义转换器的资源:
<converter:MatrixToDataViewConverter x:Key="MatrixToDataViewConverter" />

并且像这样使用它:

<DataGrid ItemsSource="{Binding Matrix, Converter={StaticResource MatrixToDataViewConverter}, ConverterParameter=1}"/>

虽然它不允许双向绑定...

编辑

这是一个数组bool[][]的版本:

public class BoolArrayToDataViewConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var array = value as bool[,];
        if (array == null) return null;

        var rows = array.GetLength(0);
        if (rows == 0) return null;

        var columns = array.GetLength(1);
        if (columns == 0) return null;

        var t = new DataTable();

        // Add columns with name "0", "1", "2", ...
        for (var c = 0; c < columns; c++)
        {
            t.Columns.Add(new DataColumn(c.ToString()));
        }

        // Add data to DataTable
        for (var r = 0; r < rows; r++)
        {
            var newRow = t.NewRow();
            for (var c = 0; c < columns; c++)
            {
                newRow[c] = array[r, c];
            }
            t.Rows.Add(newRow);
        }

        return t.DefaultView;
    }

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

以及使用方法:

<DataGrid ItemsSource="{Binding Matrix, Converter={StaticResource BoolArrayToDataViewConverter}}"/>

这是原始版本的样子。您可以对DataGrid进行样式设置和编辑模板,但这是另一个问题...

我不需要双向绑定。非常感谢您。我会尝试并回复您。 - Indhi
@user1221765 你需要稍微修改一下这个例子,因为它是针对自定义矩阵类型编写的。不过很容易,你只需要用你正在使用的数据类型(bool[][]?)替换矩阵,并更改行和列的赋值,行=数组.length,列=array[0].length(之前要检查是否为空),例如。省略四舍五入部分,因为你不会对布尔值进行四舍五入,对吧?你能做到吗,还是需要建议? - Marc
如果您能修改它,那会很有帮助 @Marc.. 我也会同时尝试。谢谢。 - Indhi
@user1221765:看一下我编辑过的答案。这个对你有用吗? - Marc
@user1221765 请看我的回答。我也修改了转换器代码,使用bool[,]比bool[][]更合理,但这取决于你的数据。 - Marc
显示剩余3条评论

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