使用IronPython和Datagrid进行Silverlight数据绑定

0 投票
1 回答
786 浏览
提问于 2025-04-15 19:02

我们一直在成功地使用clrtype和IronPython 2.6以及Silverlight进行数据绑定,这个方法是根据Lukás提供的示例来的。

http://gui-at.blogspot.com/2009/11/inotifypropertychanged-and-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中直接指定绑定,就会在加载xaml时遇到PARSER_BAD_PROPERTY_VALUE的错误(所以加载后也无法设置绑定):

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

我尝试的一个方法是创建一个值转换器。以下是我创建的类的框架:

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类时,加载xaml又出现了错误。

如果能以编程的方式设置这个就最好了。有没有人有什么想法?

1 个回答

1

我对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

目前,你可以选择绑定Ellipse的Fill属性。但这样的话,你需要在你的转换器代码中创建整个LinearGradientBrush,所以会有点复杂。

撰写回答