3

J'ai un ListBox où je place le ItemsSource à un CollectionViewSource qui est rempli à partir d'un service WCF. J'utilise un convertisseur de valeur dans le ListBox.ItemTemplate \ DataTemplate pour convertir une propriété sur les objets dans ItemsSource. Cela fonctionne comme prévu, mais maintenant j'ai besoin de mettre à jour le processus de conversion de telle sorte que la valeur convertie est toujours basée sur les valeurs de propriété d'objet individuelles, sauf lorsqu'une propriété différente est égale à une valeur spécifique. Et cette valeur est définie dans le code derrière le xaml, c'est une variable de niveau de champ définie dans le constructeur de la page.Comment utiliser une variable codebehind comme entrée pour ConverterParameter dans ValueConverter

Pour ce faire, je veux passer la variable de niveau de champ en tant que ConverterParameter de ValueConverter. J'ai essayé plusieurs façons principalement en utilisant les idées de ce this question sauf que j'ai toujours une erreur d'analyse du xaml (et l'application ne parvient pas à charger).

Un correctif peut être d'ajouter une propriété aux objets dans ItemsSource, mais je ne veux pas vraiment le faire. Partiellement parce que cet objet est utilisé dans plusieurs projets donc je ne veux pas changer je .... et parce que je veux voir si l'autre méthode est même possible. Aussi je crois que wpf a un MultiValue Converter (et peut-être SL 4.0) mais je suis sur SL 3.0. Je pense que les problèmes que j'ai rencontrés jusqu'à maintenant sont liés au chargement, à la liaison et à l'analyse du xaml.

donc quelques questions:

  • cela peut être fait que je décris ci-dessus?
  • sinon quel est le problème?
  • sinon existe-t-il une autre manière sans ajouter une propriété à l'objet?

Répondre

5

Ne me semble pas que vous voulez utiliser la liaison ConverterParameter dans ce cas. Si je vous ai bien compris, vous avez une seule valeur au niveau UserControl que vous vouliez assigner à ce paramètre, donc la valeur du paramètre pour toutes les instances serait la même. Au lieu de cela l'approche que je prendrais est d'ajouter une propriété au code Converter lui-même.

public class ExampleConverter : IValueConverter 
{ 

    public int SpecialValue { get; set; } 

    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      if (value.Equals(SpecialValue)) 
       return "Special!"; 
      else 
       return value.ToString(); 
     } 
     else 
     { 
      return null; 
     } 
    } 

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

Maintenant, vous auriez ce convertisseur ajouté aux ressources UserControl: -

<UserControl.Resources> 
    <local:ExampleConverter x:Key="conv" SpecialValue="-1" /> 
</UserControl.Resources> 

Si vous devez modifier la valeur dans le code UserControl que vous utilisez: -

((ExampleConverter)Resources["conv"]).SpecialValue = someOtherVariable; 
+0

Merci cela fonctionne, je soupçonne certains de mes problèmes dans mes tests était le fait que j'avais mis le convertisseur comme une ressource de la grille principale pas dans UserControl. –

Questions connexes