简体   繁体   English

如何将2D数组bool [] []绑定到WPF DataGrid(单向)?

[英]How to bind an 2D array bool[][] to a WPF DataGrid (one-way)?

I have a matrix kind datagrid like this. 我有像这样的矩阵类数据网格。

在此输入图像描述

this grid is designed entirely in XAML 这个网格完全是用XAML设计的

Now how to insert values into these datagridcell with 2 dimensional array ? 现在如何使用二维数组将值插入到这些datagridcell中? the values which is needed to be inserted must be of bool datatype (either TRUE or FALSE). 需要插入的值必须是bool数据类型(TRUE或FALSE)。 Any ideas ? 有任何想法吗 ?

Here is my approach for a MVVM scenario, using a converter which creates a DataView which can be bound to the grids ItemsSource . 这是我对MVVM场景的方法,使用转换器创建一个可以绑定到网格ItemsSource的DataView。 It's for a special Matrix datatype which holds doubles, but you'll be able to modify it yourself for your requirements: 它是一个特殊的Matrix数据类型,它包含双精度数,但您可以根据自己的要求自行修改它:

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

Define a resource for the converter: 为转换器定义资源:

<converter:MatrixToDataViewConverter x:Key="MatrixToDataViewConverter" />

And use it like this: 并像这样使用它:

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

It doesn't allow two way binding, though... 它不允许双向绑定,但......

EDIT 编辑

Here's the version for an array bool[][]: 这是数组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();
    }
}

and the usage: 和用法:

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

And this is what it looks like in the very raw version. 这就是它在原始版本中的样子。 You can then style the DataGrid and edit it's templates, but this is another question... 然后,您可以设置DataGrid的样式并编辑它的模板,但这是另一个问题......

UI

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM