我想加价标记以简化出价。
我有字典,并将该属性绑定到视图中的Label。
我有ValueConverter接受这句话,我通过ConverterParameter这是一个字符串,它发现

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


但是我必须对不同的标签执行相同的操作,但键(ConverterParameter)将有所不同,其余的将保持不变

我想要一个markupextension,使我可以这样写:

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


此标记应使用TranslationWithKeyConverter的valueconverter和名为Key的ConverterParameter生成对名为“ Tanslations”的属性的绑定。

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

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);
    }
}


标签上没有任何显示。

最佳答案

让我们从一个明显的警告开始:您不应该仅仅因为它简化了语法而编写了自己的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}"/>

10-08 15:06