Silverlight XAML привязать к методу расширения - PullRequest
0 голосов
/ 13 сентября 2010

Итак, я работаю над небольшим проектом, использующим карты bing 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 ]

2 голосов
/ 13 сентября 2010

Я считаю, что причина в том, что в xaml вы должны связывать либо свойство, либо свойство зависимости. Метод расширения - это просто метод. Даже если метод имитирует свойство, оно все равно не то же самое.

1 голос
/ 11 ноября 2011

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();
    }
}
0 голосов
/ 06 марта 2012

Я думаю, что это возможно.Если у меня будет время, я попытаюсь создать MarkupExtension, который поможет это сделать.

На данный момент моя идея - создать класс MarkupExtension со свойствами Source и Method.В 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"

Возможно, в скором будущем что-нибудь об этом я опубликую в своем польском блоге здесь .

...