Xamarin.Forms用于绑定的MarkupExtension

时间:2017-02-01 19:54:33

标签: c# xamarin data-binding xamarin.forms converter

我想制作扩展标记以简化出价。 我有字典,我将该属性绑定到视图中的Label。 我有ValueConverter接受这个dictinary并且我传递了ConverterParameter,这是一个字符串,它找到了

<Label Text="{Binding Tanslations,Converter={StaticResource TranslationWithKeyConverter}, ConverterParameter='Test'}"/>

但我必须为不同的标签做同样的事情,但关键(ConverterParameter)会有所不同,其余的将保持不变

我想要一个markupextension,允许我写这个:

<Label Text="{local:MyMarkup Key=Test}"/>

这个标记应该生成绑定到名为&#34; Tanslations&#34;的属性。使用TranslationWithKeyConverter和ConverterParameter的valueconverter,其值为Key。

我试图这样做,但它不起作用:

public class WordByKey : IMarkupExtension
{
    public string Key { get; set; }
    public object ProvideValue(IServiceProvider serviceProvider)
    {
        return new Binding("Tanslations", BindingMode.OneWay, converter: new TranslationWithKeyConverter(), converterParameter: Key);
    }
}

标签上没有显示任何内容。

1 个答案:

答案 0 :(得分:6)

让我们从明显的警告开始:你不应该只编写自己的MarkupExtensions,因为它简化了语法。 XF Xaml解析器和XamlC编译器可以对已知的MarkupExtensions进行一些优化技巧,但不能在你的上面进行。

现在您已经发出警告,我们可以继续前进。

如果您使用正确的名称,那么您所做的事情可能适用于普通的Xaml解析器,这与您粘贴的内容不同)但是当然没有打开XamlC。您应该实现IMarkupExtension,而不是实施IMarkupExtension<BindingBase>

[ContentProperty("Key")]
public sealed class WordByKeyExtension : IMarkupExtension<BindingBase>
{
    public string Key { get; set; }
    static IValueConverter converter = new TranslationWithKeyConverter();

    BindingBase IMarkupExtension<BindingBase>.ProvideValue(IServiceProvider serviceProvider)
    {
        return new Binding("Tanslations", BindingMode.OneWay, converter: converter, converterParameter: Key);
    }

    object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
    {
        return (this as IMarkupExtension<BindingBase>).ProvideValue(serviceProvider);
    }
}

然后您就可以像以下一样使用它:

<Label Text="{local:WordByKey Key=Test}"/>

<Label Text="{local:WordByKey Test}"/>