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 に答える