1

我有一组用于自定义控件的数据模板。它运作良好,但我希望能够将它绑定到数据并根据集合的最小值/最大值缩放值。我创建了以下值转换器:

    public class ScaleValueConverter : IValueConverter
{
    /// <summary>
    /// The property to use the value of
    /// </summary>
    public string ValueProperty { get; set; }

    /// <summary>
    /// The minimum value to be scaled against. Will become 0%
    /// </summary>
    public int MinValue { get; set; }

    /// <summary>
    /// The maximum value to be scaled against. Will become 100%.
    /// </summary>
    public int MaxValue { get; set; }


    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var type = value.GetType();
        var property = type.GetProperty(ValueProperty);

        if (property == null)
            return 0;

        var result = System.Convert.ToDecimal(property.GetValue(value, null));

        //TODO: Scale stuff

        return result + 100;
    }

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

    #endregion
}

目的是拥有一个通用值转换器,并简单地将绑定源对象提供给 XAML 中的值转换器,并让它解决问题。

但是,我不确定如何执行此操作,因为我无法访问从模板控件创建的值转换器。

我正在寻找大致如下工作的东西:

        public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        //Get Value Converters
        var topScaleValueConverter = GetTemplateChild("TopScaleValueConverter");
        var bottomScaleValueConverter = GetTemplateChild("BottomScaleValueConverter");

        //Setup value converter Min / Max / ValueProperty here
    }

理想情况下,它们将成为我模板的一部分,我可以将它们提取为部分,但这似乎不起作用。

谁能指出我让这种行为发挥作用的正确方向?

问候

特里斯坦

编辑:我想能够依赖注入它们会很好。有谁知道这是否可能?

4

1 回答 1

0

从 DependDencyObject 派生 ScaleValueConverter 并将您的属性实现为依赖属性。

  public class ScaleValueConverter : DependencyObject, IValueConverter
    {

        public double MinValue
        {
            get { return (double)GetValue(MinValueProperty); }
            set { SetValue(MinValueProperty, value); }
        }

        public static readonly DependencyProperty MinValueProperty =
            DependencyProperty.Register("MinValue", typeof(double), typeof(ScaleValueConverter), new PropertyMetadata(0.0d));


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            double result = double.Parse(value.ToString())

            if (result < MinValue)
            {
                result = MinValue;
            }

          return result;
        }
    }

然后,您将能够通过 VM 将数据“注入”到您的属性中。

<ns:ScaleValueConverter x:Key="scaleValue" MinValue="{Binding MinValue,Source={StaticResource MyModelSource}" />

简而言之,将您的转换器与任何其他依赖对象一样对待并像往常一样绑定。

于 2012-07-30T20:16:03.760 回答