1

から継承するカスタム コンバーターを作成しようとしていますDependencyObjectが、機能しません。

コンバータ:

public class BindingConverter : DependencyObject , IValueConverter
{
  public object Value
  {
    get { return (object)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
  }
  public static readonly DependencyProperty ValueProperty =
      DependencyProperty.Register("Value", typeof(object), typeof(BindingConverter), new PropertyMetadata(null));


  public object Convert(object value, Type targetType, object parameter, Globalization.CultureInfo culture)
  {
    Debug.Assert(Value != null); //fails
    return Value;
  }

  public object ConvertBack(object value, Type targetType, object parameter, Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}

Xaml:

<StackPanel x:Name="this">
  <!--works-->
  <ContentControl Content="{Binding ActualHeight, ElementName=this}"/>
  <!--doesn't work-->
  <ContentControl>
    <Binding>
      <Binding.Converter>
        <BindingConverter Value="{Binding ActualHeight, ElementName=this}" />
      </Binding.Converter>
    </Binding>
  </ContentControl>
  <TextBlock Text="{Binding Animals}"/>
</StackPanel>

私は何かを見逃していますか?

4

3 に答える 3

1

プロジェクトには、同様の機能が必要な場所がいくつかあります。正確なサンプルを表示することはできません。アイデアだけです。

  • おそらく、IValueConverterではなくFrameworkElementから継承する必要があります。次のようなものです。

    public class BindingHelper : FrameworkElement    
    
  • BindingHelperクラスで、VisibilityをCollapsedに設定し、IsHitTestVisibleをfalseに設定します。

  • 動作させるには、ビジュアルツリーに直接挿入します。あなたの例では、それはStackPanelの子である必要があります。したがって、他のStackPanelの子と同じDataContextを持ちます。
  • 次に、必要に応じて1つ以上の依存関係プロパティを追加できます。たとえば、データのソース用の単一のプロパティと、コンバーターの戻り値として使用するいくつかの異なるプロパティがあるとします。BindingHelperクラスのソースプロパティへのすべての変更を処理し、それに応じて出力プロパティを変更します。
  • ElementName構文を使用して、他のコントロールをBindingHelperクラスのプロパティにバインドします
于 2012-03-29T17:21:47.950 に答える
0

ノート!ActualHeightプロパティのバインディングはバインディングでバグがあります!

DependencyObjectコンバーターをコーディングするときに継承するのはなぜですか? を実装するだけIValueConverterです。

それを試して、

最初に、リソースの「MyConverterResource」のキーで MyConverter を追加します。次に、XAML 側または cs 側で行うことができます。

//You may do it on XAML side <UserControl.Resources>...
this.Resources.Add("MyConverterResource",new MyConverter());

<TextBlock Text="{Binding ActualHeight,ElementName=this
,Converter=MyConverterResource}"/>

public class MyConverter: IValueConverter
{

public object Convert(object value, Type targetType
, object parameter,Globalization.CultureInfo culture)
 {

   return "Your Height is:"+Value.toString();
}

}

希望が役立ちます

于 2012-03-28T14:39:42.473 に答える
0

Silverlight ではActualHeightActualWidthプロパティはプロパティの更新に関する通知を行いません。したがって、それらへのバインドは機能しません。

于 2012-03-28T14:47:27.157 に答える