2010-02-11 4 views
3

J'ai recherché ce problème pendant des heures et je ne vois pas où je me trompe.IValueCOnverter ne fonctionne pas

J'ai le convertisseur suivant qui retourne juste Brushes.Red (ont essayé Colors.Red) aussi bien mais toujours pas de chance.

public class ColorConverter : IValueConverter 
{ 
    private static ColorConverter instance = new ColorConverter(); 
    public static ColorConverter Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Brushes.Red; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new Exception("The method or operation is not implemented."); 
    } 
} 

Maintenant, dans mon XAML je le code suivant:

<StackPanel Orientation="Vertical"> 
    <TextBlock Text="{Binding Value}" TextAlignment="Center" Foreground="{Binding Path=color, Converter={x:Static local:ColorConverter.Instance}}" Margin="2"/> 
</StackPanel> 

J'ai mis Teh espace de noms suivant en haut:

xmlns:local="clr-namespace:Dashboard" 

Maintenant, j'ai la classe suivante qui est binded vers le panneau de pile:

public class MyClass : INotifyPropertyChanged 
{ 
    public String Value; 
    public Color color; 

    // Declare the PropertyChanged event 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

La liaison de données (Value) fonctionne parfaitement, mais le convertisseur ne veut pas lancer, j'ai essayé de définir un point d'arrêt dans la méthode Convert du covnerter, mais cela ne se déclenche pas lors du débogage, il semble juste que mon le débogueur n'est pas appelé.

Quelqu'un peut-il nous éclairer à ce sujet?

Répondre

2

Je suis surpris que vous disiez que la liaison elle-même fonctionne parce que "Valeur" et "couleur" sont des champs et la liaison aux champs n'est pas supposée fonctionner.

+0

ouais, je n'ai même pas pris la peine de regarder leurs déclarations parce que ça ressemblait à tout mais le convertisseur fonctionnait. :) – Dave

1

Eh bien, voici comment je l'ai fait dans mon projet. J'ai modifié mon code pour refléter ce que vous essayez de faire. J'espère que ça aide. Je ne peux pas expliquer pourquoi votre approche singleton ne fonctionnerait pas.

Classe:

public class ColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Brushes.Red; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new Exception("The method or operation is not implemented."); 
    } 
} 

Dans mon élément UserControl.Resources:

<UserControl.Resources> 
    <local:ColorConverter x:Key="MyColorConverter" /> 
</UserControl.Resources> 

élément StackPanel:

<StackPanel Orientation="Vertical"> 
    <TextBlock Text="{Binding Value}" TextAlignment="Center" Foreground="{Binding Path=color, Converter={StaticResource MyColorConverter}}" Margin="2"/> 
</StackPanel> 

Aussi, avez-vous vérifié votre fenêtre de sortie pour voir s'il y a des erreurs? Vous devriez également lire Bea Stollnitz's article on debugging databindings. Elle a en fait une section spécifique sur IValueConverters qui pourrait vous être utile un jour.

+0

Merci pour cela! J'ai trouvé le problème après être allé dans ma fenêtre de sortie. Je ne savais pas que pour faire une variable une propriété, vous devez ajouter {set; obtenir; } à lui. Donc je ne les ai pas eu là et la production se sont plaints qu'il ne peut pas trouver la propriété de «couleur». Vraiment apprécier l'aide, et merci pour le lien. Ajouté aux favoris! –

+0

ah oui, vous avez utilisé un champ au lieu d'une propriété. J'ai déjà fait cette erreur (et je l'ai encore fait, apparemment). :) – Dave