8

このようなマトリックス型のデータグリッドがあります。

ここに画像の説明を入力

このグリッドはすべて XAML で設計されています

2次元配列を使用してこれらのdatagridcellに値を挿入する方法は? 挿入する必要がある値は、boolデータ型 (TRUE または FALSE) である必要があります。何か案は ?

4

1 に答える 1

17

grids にバインドできる DataView を作成するコンバーターを使用して、MVVM シナリオに対する私のアプローチを次に示しますItemsSource。これは double を保持する特別な 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();
    }
}

コンバーターのリソースを定義します。

<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 のスタイルを設定し、そのテンプレートを編集できますが、これは別の問題です...

UI

于 2013-05-29T11:39:53.750 に答える