Silverlight xaml绑定到扩展方法

时间:2010-09-12 21:14:38

标签: c# silverlight bing-maps

所以我正在使用bing maps silverlight sdk开展一个小项目。我从服务器上获得了一堆对象(通过wcf服务),每个设备都有一个lat / long属性。要在bing地图上映射某些东西,你可以为它提供一个Location类型(基本上只是lat / long的包装器)

我正在使用的类型存储在服务器上,只有lat long。我写了一个名为Location的扩展方法,它将它们包装到一个位置并返回它们。

       <DataTemplate x:Key="MapVisualDataTemplate">
        <m:Pushpin m:MapLayer.Position="{Binding Location}" />
    </DataTemplate>

即使扩展方法在C#中可见且可用,xaml也没有正确使用它。如果我将属性直接添加到服务器上的类型,它可以正常工作。只有将其定义为扩展方法才能起作用。我宁愿让它成为一种扩展方法,因为它最终将用于各种类型。

当Location是当前绑定的任何类型的扩展方法时,是否可以使用上面的语法进行绑定?

3 个答案:

答案 0 :(得分:2)

我相信原因是在xaml中你必须绑定到属性或依赖属性。扩展方法就是一种方法。即使该方法模仿一个​​属性,它仍然不是一回事。

答案 1 :(得分:1)

扩展方法的XAML等价物是值转换器。这是一个例子:

public class Converter:IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return "foo";
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:0)

我认为这是可能的。如果我有时间,我会尝试创建有助于实现这一目标的MarkupExtension。

目前,我的想法是使用Source和Method属性创建MarkupExtension类。在XAML中我们会像这里一样使用它:

<TextBlock Text="{BindExt Source={Binding DataContext}, Method=MyExtMethod}" />

Source是一个属性,我们在其中设置一个我们调用MyExtMethod(扩展方法)的源对象。由于找到这种方法的性能,我可能会添加另一个名为ExType的属性,其中将存储一种静态类,其中声明了MyExtMethod。这有助于提高搜索扩展方法的性能,但XAML语法会更长:/

所以我们现在有了一些原型表达式:

<TextBlock Text="{BindExt Source={Binding DataContext}, Method=MyExtMethod, ExType=ex:ExtMethods}" />

其中“ex”前缀可以是例如BrightShadow.Data.Extensions命名空间:

xmlns:ex="clr-namespace:BrightShadow.Data.Extensions;assembly=BrightShadowAssembly"

也许在不久的将来,我会在我的波兰博客上发布here