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

xml:

<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

我的项目中有一些地方需要类似的功能。无法向您展示确切的样本,只是一个想法:

  • 也许你必须从 FrameworkElement 继承,而不是 IValueConverter,像这样:

    public class BindingHelper : FrameworkElement    
    
  • 在 BindingHelper 类中,将 Visibility 设置为 Collapsed 并将 IsHitTestVisible 设置为 false;

  • 要使其正常工作,请将其直接插入到可视化树中。在您的示例中,它应该是 StackPanel 的子级。因此,它将具有与其他 StackPanel 子项相同的 DataContext;
  • 然后,您可以根据需要添加一个或多个依赖项属性。例如,您可能具有数据源的单个属性和一些不同的属性,然后您将这些属性用作转换器返回值。处理 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 中,ActualHeight属性ActualWidth不会通知属性更新。所以,绑定到他们是行不通的。

于 2012-03-28T14:47:27.157 回答