自定义IValueConverter继承自DependencyObject

时间:2012-12-08 14:10:34

标签: wpf binding ivalueconverter dependencyobject

我想尝试能够拥有一个转换器,其参数可以与当前数据上下文绑定。有人能告诉我为什么在到达Convert()函数时,Source属性总是为空吗?

namespace WpfApplication32
{
    public class ConverterTest : DependencyObject, IValueConverter
    {
        public static readonly DependencyProperty SourceProperty =
            DependencyProperty.Register("Source", typeof(DependencyObject), typeof(ConverterTest));

        public DependencyObject Source
        {
            get { return (DependencyObject)this.GetValue(SourceProperty); }
            set { this.SetValue(SourceProperty, value); }
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            Value = 7;

            InitializeComponent();
            DataContext = this;
        }

        public float Value
        {
            get;
            set;
        }
    }
}




<Window x:Class="WpfApplication32.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication32">

    <Slider>
        <Slider.Value>
            <Binding Path="Value">
                <Binding.Converter>
                    <local:ConverterTest Source="{Binding}"/>
                </Binding.Converter>
            </Binding>
        </Slider.Value>
    </Slider>

</Window>

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是让您的转换器继承自 Freezable Hillberg Freezable trick)。然后,您甚至可以在资源中定义Converter,并在绑定中将其作为属性引用,而不是额外的子元素。