Связать сетку с 2D-массивом [дубликат]

Ваш Javascript будет выполняться на клиенте, а не на сервере. Это означает, что foo не оценивается на стороне сервера, и поэтому его значение не может быть записано в файл на сервере.

Лучший способ подумать об этом процессе - это как будто вы генерируя текстовый файл динамически. Текст, который вы генерируете, становится исполняемым кодом после того, как браузер интерпретирует его. Только то, что вы размещаете между тегами <?php, оценивается на сервере.

Кстати, создание привычки встраивать случайные фрагменты PHP-логики в HTML или Javascript может привести к серьезному запутанному коду. Я говорю от болезненного опыта.

53
задан Daniel Plaisted 10 November 2008 в 02:15
поделиться

4 ответа

Цель 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>

. И в коде, за которым стоит набор ItemsSource lst с структурой TwoDimentional.

  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, чтобы добавить более конкретные данные вашего объекта.

alt text [/g0]

62
ответ дан Ilmari Karonen 25 August 2018 в 11:44
поделиться
  • 1
    Мне не обязательно использовать сетку для привязки данных, но я не хочу создавать список списков для источника. Я хочу использовать объект с индексом, который принимает два параметра: x и y. – Daniel Plaisted 10 November 2008 в 03:52
  • 2
    WPF-привязка не может распознать массив, это должна быть коллекция Enumerable. Поэтому лучше создайте Список Список и привяжите его к нему. – Jobi Joy 13 November 2008 в 05:57
  • 3
    Можно ли использовать новый DataGrid для WPF для этого? – Brian Low 10 July 2010 в 23:03
  • 4
    Бонусные баллы за использование эталонного изображения для отображения правильных результатов. Картинка стоит 2 ^ 10 слов. – ford 22 October 2011 в 01:08
  • 5
    Быстрый вопрос, действительно ли вам нужно использовать DynamicResource в этом примере или Static также может сделать это? – Kranach 13 May 2014 в 18:02

Вот еще одно решение, основанное на ответе Meleak , но не требующее обработчика события 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;
}
42
ответ дан Community 25 August 2018 в 11:44
поделиться
  • 1
    Отличный пример, спасибо, что разделили его! У вас был вопрос в DataGrid2D.cs: «Лучший способ узнать это?». Я думаю, вы можете написать: bool multiDimensionalArray = type.IsArray && type.GetArrayRank() == 2; и оператор if двумя строками выше: if (e.NewValue is IList && (!type.IsArray || type.GetArrayRank() <= 2)) Кажется, что это работает, не удалось найти проблему во время быстрой проверки примеров. – Slauma 14 February 2011 в 18:57
  • 2
    @Slauma: Рад, что вам понравилось и спасибо за отзывы! Я надеялся, что кто-нибудь в конце концов даст мне обновление об этом :) Я попробую и обновить lib! Еще раз спасибо! – Fredrik Hedblad 14 February 2011 в 19:45
  • 3
    Я просто тестирую и немного поиграю;) Кажется, есть еще один незначительный сбой: я думаю, в ItemsSource2DPropertyChanged EventHandler вам нужно рассмотреть случай, когда e.NewValue является null. Когда кто-то устанавливает ItemsSource2D на нуль, он сбой. У меня просто была такая ситуация случайно. Я просто разместил if (e.NewValue != null) вокруг всего EventHandler. Это больше не крушит, но я не уверен, что этого достаточно. Возможно, также dataGrid2D.ItemsSource необходимо установить на null ?? – Slauma 14 February 2011 в 21:23
  • 4
    @Slauma: он определенно не должен сбой при установке ItemsSource2D в null :) Это было ранее обработано оператором if, но из-за попытки оптимизации я случайно сломал его. Я загрузил новую версию, которая реализует предложение с вашего первого комментарий и исправить ошибку null. Еще раз спасибо! – Fredrik Hedblad 16 February 2011 в 09:09
  • 5
    Привет Meleak, можно ли получить источник вашего lib DataGrid2D? Thx Fred – Fred 17 February 2011 в 22:52

Я написал небольшую библиотеку прикрепленных свойств для DataGrid. Вот источник

Образец, где Data2D является int[,]:

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

Renders: enter image description here [/g1]

3
ответ дан Johan Larsson 25 August 2018 в 11:44
поделиться
  • 1
    Удивленный нет комментариев к этому. Больше ничего не могу найти для того, чтобы сделать что-то простое. Проведите дни, пытаясь привязать 2D-массив к gridview! Так сложно, когда требуется меньше 10 минут в winforms – rolls 7 November 2016 в 06:00

Вы можете проверить эту ссылку: http://www.thinkbottomup.com.au/site/blog/Game_of_Life_in_XAML_WPF_using_embedded_Python

Если вы используете Список в пределах Список вы можете использовать myList [x] [y] для доступа к ячейке.

0
ответ дан Torsten 25 August 2018 в 11:44
поделиться
  • 1
    со списком внутри списка обычно является mylist [y] [x] – MikeT 16 January 2013 в 11:31
Другие вопросы по тегам:

Похожие вопросы: