我想加价标记以简化出价。
我有字典,并将该属性绑定到视图中的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}"/>