現在、私はこのようなマークアップを持っています
<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);
}