Вы можете преобразовать объект sqlalchemy в такой словарь и вернуть его как json / dictionary.
Вспомогательные функции:
import json
from collections import OrderedDict
def asdict(self):
result = OrderedDict()
for key in self.__mapper__.c.keys():
if getattr(self, key) is not None:
result[key] = str(getattr(self, key))
else:
result[key] = getattr(self, key)
return result
def to_array(all_vendors):
v = [ ven.asdict() for ven in all_vendors ]
return json.dumps(v)
Функция драйвера:
def all_products():
all_products = Products.query.all()
return to_array(all_products)
Не используйте события в DataTemplate
. Они не будут работать.
Переместите второе контекстное меню из ресурсов DataTemplate
в ресурсы PageListBox
следующим образом:
<ListBox Name="PageListBox">
<ListBox.Resources>
<!-- ... other resources... -->
<ContextMenu x:Key="FrameContextMenu">
<MenuItem Header="_Add Frame" Name="ContextAddFrame"/>
<MenuItem Header="_Edit Frame" Name="ContextEditFrame"/>
<MenuItem Header="_Delete Selected Frame(s)" Click="ContextDeleteFrames_Click"/>
<MenuItem Header="Show _Preview" Name="ContextShowPreview" Click="ContextShowPreview_Click"/>
</ContextMenu>
</ListBox.Resources>
</ListBox>
... или используйте команды вместо событий:
<MenuItem Header="_Delete Selected Frame(s)" Command="{Binding DeleteFrameCommand}"/>
, где DeleteFrameCommand
является свойством типа ICommand
или RoutedCommand
.
Если вы хотите использовать команды, что контекстное меню не находится в визуальном дереве его PlacementTarget
, поэтому вам нужно будет использовать некоторые помощники, чтобы заставить привязки работать (связующий прокси или свойство PlacementTarget.Tag
и т. д.).