目前我有这样的标记
<TextBlock>
<TextBlock.Text>
<Binding Path="Value" ElementName="window" ConverterParameter="M">
<Binding.Converter>
<local:DatePartValueConverter />
</Binding.Converter>
</Binding>
</TextBlock.Text>
</TextBlock>
我想把它缩短成这样
<TextBlock Text="{Binding Path=Value,ElementName=window,
ConverterParameter=M,Converter={local:DatePartValueConverter}}" />
但是编译器会出错,因为 DatePartValueConverter 不是从 MarkupExtension 派生的。没有其他方法可以获取短格式标记来创建 DatePartValueConverter 的实例吗?
顺便说一句,我尝试从 MarkupExtension 派生,它确实解决了问题。我的 ProvideValue 实现看起来像这样
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new DatePartValueConverter();
}
它有效,但我仍然不清楚它的起源和性质,serviceProvider
以及人们可能会用它做什么。
有趣的是,当我在使用此标记扩展的绑定上使用 Visual Studio 2012 绑定编辑器时,它立即再次扩展它,使整个标记扩展支持变得毫无意义。
我可能应该提到,我需要为每个绑定提供一个私有实例,因为它维护内部状态 - 它需要知道整个 DateTime 值来设置某些方面,就像这样
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
culture = System.Globalization.CultureInfo.CurrentCulture;
var strValue = value as string;
int y = _value.Year, M = _value.Month, d = _value.Day,
H = _value.Hour, m = _value.Minute, s = _value.Second;
if (strValue == null)
return null;
else
{
string p = parameter as string;
switch (p)
{
case "yyyy":
y = int.Parse(strValue); break;
case "yy":
y = (strValue.Length == 4) ?
int.Parse(strValue) :
int.Parse(DateTime.Now.Year.ToString().Substring(0, 2) + strValue);
break;
case "M":
case "MM":
M = int.Parse(strValue); break;
...
}
}
return new DateTime(y, M, d, H, m, s);
}