Xamarin Forms: IMarkupExtension с привязываемым свойством не работает

Привязка не работает для тега изображения. Когда я отлаживаю, я вижу, что значение класса Source in Extension всегда равно нулю? Но содержание метки не равно нулю.

Xaml

<Label Text="{Binding Image}" />
<Image Source="{classes:ImageResource Source={Binding Image}}" />

ImageResourceExtension

// You exclude the 'Extension' suffix when using in Xaml markup
[Preserve(AllMembers = true)]
[ContentProperty("Source")]
public class ImageResourceExtension : BindableObject, IMarkupExtension
{
    public static readonly BindableProperty SourceProperty = BindableProperty.Create(nameof(Source), typeof(string), typeof(string), null);
    public string Source
    {
        get { return (string)GetValue(SourceProperty); }
        set { SetValue(SourceProperty, value); }
    }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        if (Source == null)
            return null;

        // Do your translation lookup here, using whatever method you require
        var imageSource = ImageSource.FromResource(Source);

        return imageSource;
    }
}

person Ali Eren    schedule 07.03.2017    source источник
comment
Вы пытаетесь загрузить изображение, которое является встроенным ресурсом или активом?   -  person Malte Goetz    schedule 07.03.2017
comment
Не пробовал ваш пример, но свойство BindableProperty объявлено неправильно. Параметр объявления типа должен быть typeof (ImageResourceExtension), а не typeof (string). Но также, как указано в ответе ниже, вместо этого вам следует использовать конвертер.   -  person Andrew Tavera    schedule 07.03.2017


Ответы (1)


Конечно же нет!

Это не потому, что вы наследуете от BindableObject, что ваш объект волшебным образом имеет BindingContext набор. А без BindingContext невозможно решить {Binding Image}.

То, что вы ищете, это конвертер

class ImageSourceConverter : IValueConverter
{
    public object ConvertTo (object value, ...)
    {
        return ImageSource.FromResource(Source);
    }

    public object ConvertFrom (object value, ...)
    {
        throw new NotImplementedException ();
    }
}

You then add this converter to your Xaml root element resources (or Application.Resources and use it in your Bindings

<Label Text="{Binding Image}" />
<Image Source="{Binding Image, Converter={StaticResource myConverter}}" />
person Stephane Delcroix    schedule 07.03.2017
comment
Предположим, вам нужно передать более одного параметра, один из которых является связанным значением? У меня есть конвертер, который я начал переделывать в настраиваемую разметку, чтобы добавить третий ввод [который не привязан], пока я не обнаружил, что настраиваемая разметка не может обрабатывать привязку. - person ToolmakerSteve; 21.06.2018
comment
nm, я только что нашел это: Конвертер с параметрами мультипликатора?. - person ToolmakerSteve; 21.06.2018