Silverlight xaml привязывается к методу расширения

Итак, я работаю над небольшим проектом, используя bing maps silverlight sdk. Я получаю кучу объектов с сервера (через службы wcf), и каждое из этих устройств имеет свойства широты/долготы. Чтобы отобразить что-то на картах Bing, вы указываете тип местоположения (по сути, это просто оболочка для широты/долготы).

Типы, с которыми я работаю, хранятся на сервере и имеют только лат. Я написал метод расширения под названием Location, который оборачивает их в местоположение и возвращает их.

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

Несмотря на то, что метод расширения виден и может использоваться внутри C#, он не используется должным образом в xaml. Если я добавлю свойство непосредственно в тип на сервере, он будет работать нормально. Только если он определен как метод расширения, он не работает. Я бы предпочел, чтобы это был метод расширения, потому что в конечном итоге он будет использоваться для самых разных типов.

Можно ли выполнить привязку с использованием приведенного выше синтаксиса, когда Location является методом расширения для любого типа, к которому в настоящее время привязано?


person brandon    schedule 12.09.2010    source источник


Ответы (3)


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

person brandon    schedule 12.09.2010

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();
    }
}
person Chui Tey    schedule 11.11.2011

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

На данный момент моя идея состоит в том, чтобы создать класс MarkupExtension со свойствами Source и Method. В XAML мы бы использовали это так:

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

Источник — это свойство, в котором мы устанавливаем исходный объект, для которого мы вызываем 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"

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

person Community    schedule 06.03.2012