Для этого вам нужно FrameworkTemplate.FindName Method (String, FrameworkElement)
:
private childItem FindVisualChild(DependencyObject obj)
where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
Затем:
for (int i = 0; i < Game_ScrollViewer_online.Items.Count; i++)
{
ListBoxItem GameListBoxItem = (ListBoxItem)(Game_ScrollViewer_online.ItemContainerGenerator.ContainerFromIndex(i));
ContentPresenter contentPresenter = FindVisualChild(GameListBoxItem);
DataTemplate myDataTemplate = contentPresenter.ContentTemplate;
Button tempBut = (Button) myDataTemplate.FindName("Current_game_button", contentPresenter);
//Do stuff with button
}
Для решения проблемы с отсутствующим FindName
используйте FindDescendant
вот так:
public T FindDescendant(DependencyObject obj) where T : DependencyObject
{
if (obj is T)
return obj as T;
int childrenCount = VisualTreeHelper.GetChildrenCount(obj);
if (childrenCount < 1)
return null;
for (int i = 0; i < childrenCount; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child is T)
return child as T;
}
for (int i = 0; i < childrenCount; i++)
{
DependencyObject child = FindDescendant(VisualTreeHelper.GetChild(obj, i));
if (child != null && child is T)
return child as T;
}
return null;
}
Разработка bigtable схемы является открытым процессом и в основном требует, чтобы Вы думали о:
Хранилище данных GAE автоматически денормализовывает Ваши данные. Таким образом, каждый индекс содержит (главным образом) полную копию данных, и таким образом каждый индекс значительно добавляет ко времени, потраченному для выполнения записи и используемого пространства памяти.
Если бы это не имело место, то разрабатывание схемы Хранилища данных было бы намного большим количеством работы: необходимо было бы думать тщательно о первичном ключе для каждого типа и рассмотреть эффект решения о местности данных. Например, при рендеринге сообщения в блоге необходимо было бы, вероятно, отобразить комментарии для соглашений с ним, таким образом, ключ каждого комментария, вероятно, начнется с ключа связанного сообщения.
С Хранилищем данных это не такое грандиозное предприятие: запрос, который Вы используете, посмотрит что-то как "Выбор * ИЗ Комментария ГДЕ post_id = N." (Если бы Вы хотите разбить на страницы комментарии, у Вас также были бы предельный пункт и возможный суффикс "И comment_id> last_comment_id".), После того как Вы добавляете такой запрос, Хранилище данных создаст индекс для Вас, и Ваши чтения будут волшебно быстры.
Что-то для учета - то, что каждый дополнительный индекс создает некоторую дополнительную стоимость: лучше, если можно использовать как можно меньше схем доступа, так как это сократит количество индексов, которые GAE создаст, и таким образом общее устройство хранения данных, требуемое данными.
Перечитывая по этому ответу, я нахожу его немного неопределенным. Возможно, практический вопрос о дизайне помог бы определить объем этого вниз?:-)
Можно использовать www.web2py.com. Вы создаете модель и приложение однажды, и это работает над GAE, но также и witl SQLite, MySQL, Posgres, Oracle, MSSQL, FireBird
Поскольку GAE основывается, как данными управляют в Django существует много информации о том, как рассмотреть подобные вопросы в документации Django (например, видят здесь, прокручивают вниз к 'Вашей первой модели').
Короче говоря Вы разрабатываете Вас модель дб как регулярная объектная модель и позволяете GAE разобраться во всех объектно-реляционных отображениях.