我正在尝试制作一个从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>
我错过了什么吗?
我的项目中有一些地方需要类似的功能。无法向您展示确切的样本,只是一个想法:
-
也许你必须继承FrameworkElement,而不是IValueConverter,类似这样的东西:
public class BindingHelper : FrameworkElement
-
在BindingHelper类中,将Visibility设置为Collapsed,将IsHitTestVisible设置为false;
- 要使其工作,请将其直接插入到可视化树中。在您的示例中,它应该是StackPanel的子级。因此,它将具有与其他StackPanel子级相同的DataContext
- 然后,您可以根据需要添加一个或多个依赖属性。例如,您可能有一个数据源属性和一些不同的属性,然后将它们用作转换器返回值。在BindingHelper类中处理对源属性的所有更改,并相应地更改输出属性
- 使用ElementName语法将其他控件绑定到BindingHelper类的属性
在Silverlight中,ActualHeight
和ActualWidth
属性不会对属性更新进行通知。所以,绑定它们是行不通的。
注意!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();
}
}
希望帮助