2012-03-28 72 views
0

我试图让从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> 

我错过了什么?

回答

1

我在我的项目中有一些地方需要类似的功能。不能告诉你确切的样品,只是一个想法:

  • 也许你必须从FrameworkElement的,不是的IValueConverter,事情是这样的继承:在BindingHelper类

    public class BindingHelper : FrameworkElement  
    
  • ,显示设置更改为Collapsed和IsHitTestVisible为false;

  • 使其工作,直接插入可视化树。在你的例子中,它应该是StackPanel的子元素。因此,它将具有与其他StackPanel子级相同的DataContext;
  • 然后,您可以根据需要添加一个或多个依赖项属性。例如,对于数据源和一些不同的属性,您可能具有单一属性,然后将其用作转换器返回值。处理BindingHelper类中源属性的所有更改并相应地更改输出属性;
  • 结合其他控制到BindingHelper类的属性使用的ElementName语法
0

注意! ActualHeight属性的绑定是有约束力的绑定!

为什么在编码转换器时继承DependencyObject?您应该只执行IValueConverter

试一下,

首先在您的资源“MyConverterResource”然后的键添加MyConverter, 您可以通过

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

} 

希望不是在XAML侧或CS侧做有助于

+0

首先,遗憾用于选择的ActualHeight /宽度为我的例子。在我真实世界的例子中,我试图实现一个模仿WPF'{RelativeSourcePreviuosData}'功能的转换器。所以要做到这一点,我想传递一下绑定,这是对集合的引用。我试图用'{Binding Converter = {PreviousDataConverter Collection = {Binding ItemsSource,ElementName = myItemsControl}}}'绑定。 – Shimmy 2012-03-29 00:49:34

+0

我想我现在得到了这个问题,你试图在UI上一起显示源代码的当前和以前的数据。如果我是对的,你可以使用Converter参数来实现这个功能。我以前不需要这个特性,但对于某些转换器,我将参数传递给Convert方法以获得不同的响应。 {Binding Source = itemssouce,converter = preconverter,converterparameter = {Binding ElementName = X,Path = index?},...这样的事情? – 2012-03-29 07:37:31

+0

这肯定不会奏效,'Parameter'转换器不可绑定AFAIK。 – Shimmy 2012-03-29 15:28:21

0

在Silverlight中,ActualHeightActualWidth属性不会对属性更新进行通知。所以,绑定到他们将无法正常工作。

+0

请阅读我对Davut的回答的评论。 – Shimmy 2012-03-29 00:49:57