0

現在、私はこのようなマークアップを持っています

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

2 に答える 2

3

のインスタンスをDatePartValueConverterリソースとして作成し、それを使用できます。

<Window.Resources>
  <local:DatePartValueConverter x:Key="datePartValueConverter" />
</Window.Resources>

<TextBlock Text="{Binding Path=Value, ElementName=window,
  ConverterParameter=M, Converter={StaticResource datePartValueConverter}}" />

編集コンバーターを作成したい場合は、MarkupExtensionそうすることができます。で新しいインスタンスを返すかProvideValue、で現在のインスタンスを返すことができますreturn this;

現在のインスタンスを返すことで、コンバーターにプロパティを設定でき、このようなことができます。

public class DatePartValueConverter : MarkupExtension, IValueConverter {
    public string ParseType { get; set; }
    // other methods
}

<TextBlock Text="{Binding Path=Value, ElementName=window,
  Converter={local:DatePartValueConverter ParseType=M}}" />

MarkupExtension.ProvideValueをIServiceProvider参照してください— IServiceProviderは実際に使用されていますか?

于 2013-01-22T01:51:12.033 に答える
1

MarkupExtension私が知っていることからコンバーターを導出する以外の唯一の方法は、独自のカスタムバインディングクラスを作成することです(を見てくださいDelayBinding)。

于 2013-01-22T03:55:50.110 に答える