Ваш Javascript будет выполняться на клиенте, а не на сервере. Это означает, что foo
не оценивается на стороне сервера, и поэтому его значение не может быть записано в файл на сервере.
Лучший способ подумать об этом процессе - это как будто вы генерируя текстовый файл динамически. Текст, который вы генерируете, становится исполняемым кодом после того, как браузер интерпретирует его. Только то, что вы размещаете между тегами <?php
, оценивается на сервере.
Кстати, создание привычки встраивать случайные фрагменты PHP-логики в HTML или Javascript может привести к серьезному запутанному коду. Я говорю от болезненного опыта.
Цель 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, чтобы добавить более конкретные данные вашего объекта.
[/g0]
Вот еще одно решение, основанное на ответе 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;
}
bool multiDimensionalArray = type.IsArray && type.GetArrayRank() == 2;
и оператор if двумя строками выше: if (e.NewValue is IList && (!type.IsArray || type.GetArrayRank() <= 2))
Кажется, что это работает, не удалось найти проблему во время быстрой проверки примеров.
– Slauma
14 February 2011 в 18:57
ItemsSource2DPropertyChanged
EventHandler вам нужно рассмотреть случай, когда e.NewValue
является null
. Когда кто-то устанавливает ItemsSource2D
на нуль, он сбой. У меня просто была такая ситуация случайно. Я просто разместил if (e.NewValue != null)
вокруг всего EventHandler. Это больше не крушит, но я не уверен, что этого достаточно. Возможно, также dataGrid2D.ItemsSource
необходимо установить на null
??
– Slauma
14 February 2011 в 21:23
ItemsSource2D
в null :) Это было ранее обработано оператором if, но из-за попытки оптимизации я случайно сломал его. Я загрузил новую версию, которая реализует предложение с вашего первого комментарий и исправить ошибку null
. Еще раз спасибо!
– Fredrik Hedblad
16 February 2011 в 09:09
Я написал небольшую библиотеку прикрепленных свойств для DataGrid
. Вот источник
Образец, где Data2D является int[,]
:
<DataGrid HeadersVisibility="None"
dataGrid2D:Source2D.ItemsSource2D="{Binding Data2D}" />
Renders: [/g1]
Вы можете проверить эту ссылку: http://www.thinkbottomup.com.au/site/blog/Game_of_Life_in_XAML_WPF_using_embedded_Python
Если вы используете Список в пределах Список вы можете использовать myList [x] [y] для доступа к ячейке.