Привязка данных Silverlight с помощью IronPython и Datagrid - PullRequest
0 голосов
/ 08 февраля 2010

Мы успешно используем clrtype с IronPython 2.6 и Silverlight для привязки данных, основанный на примере, представленном Lukás (:

http://gui -at.blogspot.com / 2009/11 / INotifyPropertyChanged-и-databinding.html

Мы создаем привязку при программном создании столбцов сетки данных. Поскольку мы используем IronPython , некоторые методов статической привязки данных, которые вы обычно используете с C #, не работают.

Я пытался (и не смог) получить столбец в сетке разные цвета на основе привязки данных.

У меня есть цветной пузырь , показывающий в сетке, но я не могу получить привязка данных к цвету для работы. Сначала основы.

Это xaml для пузыря с фиксированным цветом:

<DataTemplate xmlns='http://schemas.microsoft.com/client/2007'
 xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Ellipse Stroke="#FF222222" Height="15" Width="15">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop x:Name="bubbleColor" Offset="0.694"
            Color="#FF00FF40" />
<GradientStop Color="#FFE6E6E6"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>

Я могу добавить столбец на основе этого шаблона очень просто. Функция loadXaml представляет собой тонкую оболочку вокруг XamlReader.Load:

     from com_modules.loadxaml import loadXaml
     from System.Windows.Controls import DataGridTemplateColumn
     column = DataGridTemplateColumn()
     column.CellTemplate = loadXaml('templatecolumn')
     column.Header = 'Bubble'

     grid.Columns.Add(column)

Если я попытаюсь наивно указать привязку в xaml, то получу PARSER_BAD_PROPERTY_VALUE, когда я пытаюсь загрузить xaml (поэтому нет надежды на настройка привязки после загрузки):

<GradientStop x:Name="bubbleColor" Offset="0.694" Color="{Binding color}" />

Один из подходов, которые я попробовал, заключался в создании ValueConverter. Здесь скелет класса, который я создал:

from System import Type
from System.Globalization import CultureInfo
from System.Windows.Data import IValueConverter

class ColorConverter(IValueConverter):
   _clrnamespace = "Converters"
   __metaclass__ = clrtype.ClrClass

   @clrtype.accepts(object, Type, object, CultureInfo)
   @clrtype.returns(object)
   def Convert(self, value, targetType, parameter, culture):
     pass

   @clrtype.accepts(object, Type, object, CultureInfo)
   @clrtype.returns(object)
   def ConvertBack(self, value, targetType, parameter, culture):
     pass

Поскольку указан _clrnamespace, я подумал, что смогу использовать этот конвертер в xaml. Попытка сослаться на класс ColorConverter в пространстве имен Converters в словаре ресурсов снова вызывает взлеты при загрузке xaml.

Установка этого программного значения была бы идеальной. У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 09 февраля 2010

Я ничего не знаю о IronPython, но я знаю, что вы не можете связать цвет в Silverlight, независимо от используемого языка. Это вызвало у меня много обид. В Silverlight 3 вы можете связывать свойства только в FrameworkElement, и поскольку GradientStop является объектом DependencyObject, он не будет работать. Хорошей новостью является то, что Silverlight 4 избавится от этого ограничения и позволит вам связывать свойства в DependencyObject. Я еще не пробовал, поэтому не могу сказать наверняка. Больше информации здесь:
http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#dobind

В данный момент вы можете вместо этого связать свойство Fill с Эллипсом. Но тогда вам придется создать весь LinearGradientBrush в вашем коде конвертера, так что это немного сложно.

...