所以我正在使用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是当前绑定的任何类型的扩展方法时,是否可以使用上面的语法进行绑定?
答案 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。