2017-02-01 43 views
2

我想做出标记扩展以简化投标。 我有字典,我将该属性绑定到视图中的标签。 我有ValueConverter负责这种词典]和我通过ConverterParameter这是一个字符串,它发现Xamarin.Forms用于绑定的MarkupExtension

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

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

我想的MarkupExtension,让我写这篇文章:

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

此标记应生成绑定到一个名为“Tanslations”与TranslationWithKeyConv的valueconverter财产erter和ConverterParameter的值为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); 
    } 
} 

没有显示在标签上。

+0

文本是一个字符串,那么标记扩展需要提供来自ProvideValue的字符串,与Binding标记扩展相同。它不会有一个标记扩展返回另一个。 – JimBobBennett

+0

Xamarin.Forms已经有了一个推荐的方法来做到这一点。请参阅https://developer.xamarin.com/guides/xamarin-forms/advanced/localization/ – matthewrdev

回答

4

让我们从显而易见的警告开始:您不应只编写自己的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}"/>