1

J'ai un ensemble de modèles de données que je utilise pour mon contrôle personnalisé. Cela fonctionne bien, mais je veux pouvoir le lier aux données et avoir des valeurs d'échelle basées sur le min/max de l'ensemble. J'ai créé le convertisseur de valeur suivante:Convertisseurs valeur à l'intérieur Manipulation DataTemplate

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 
} 

L'objectif est d'avoir un convertisseur de valeur générique et simplement fournir l'objet source de liaison, au convertisseur de valeur dans le XAML, et le faire arranger les choses.

Je ne suis pas sûr de savoir comment faire cela, cependant, que je ne peux pas accéder au convertisseur de valeur que j'ai créé de mon contrôle basé sur un modèle.

Je cherche quelque chose qui fonctionnerait à peu près comme suit:

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

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

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

Idéalement ils seraient parties de mon modèle, et je pourrais les extraire comme des parties, mais cela ne semble pas fonctionner.

Quelqu'un peut-il me diriger dans la bonne direction pour obtenir ce type de travail comportement?

Cordialement

Tristan

EDIT: Je suppose que ce serait bien de pouvoir les injecter à la dépendance. Est-ce que quelqu'un sait si c'est possible? Dérivez ScaleValueConverter à partir de DependDencyObject et implémentez vos propriétés en tant que propriétés de dépendance.

Répondre

0

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; 
     } 
    } 

Vous pourrez ensuite "injecter" des données dans vos propriétés via une VM. En bref, traitez votre convertisseur de la même manière que tout autre objet de dépendance et liez comme d'habitude.

+0

Salut, merci. Cela semble devoir faire l'affaire, mais je suis en quelque sorte bloqué sur une implémentation spécifique. Les ScaleValueConverters sont liés dans le modèle d'objet d'un ItemsControl, mais ils ont besoin d'un accès à l'ensemble des parents pour calculer Min/Max. Comment puis je faire ça? – Tristan

+0

Je ne traiterais probablement pas ceci avec un convertisseur, plutôt je mettrais à jour le modèle de données pour inclure le min et le max. Une autre approche qui fonctionne lorsque vous avez un élément complexe est de le construire comme un contrôle basé sur un modèle. Nourriture pour la pensée. – Brian

Questions connexes