J'ai une classe Window
, où j'ai plusieurs éléments TextBlock
qui devraient recevoir une couleur Background
d'une valeur d'une propriété Binding
. Le premier "Convertisseur de liaison" fonctionne bien et fait tout ce que l'on attend. Aujourd'hui, j'ai essayé de mettre en œuvre une autre « Convertisseur de liaison » avec un autre Converter
utilisé pour, mais il ne fonctionne pas:WPF: ValueConverter (IValueConverter) ne fonctionne pas
(je quittais les méthodes ConvertBack
parce qu'ils ne sont pas nécessaires ici):
namespace InsightTool.Gui.Helper {
[ValueConversion(typeof(double), typeof(Brush))]
public class AverageExecutionTimeToColorConverter : IValueConverter {
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
double val;
double.TryParse(value.ToString(), out val);
if (val >= 10000) {
return Brushes.Red;
} else if (val >= 5000) {
return Brushes.Orange;
} else {
return Brushes.Green;
}
}
}
[ValueConversion(typeof(int), typeof(Brush))]
public class ThreadsAvailableCountToColorConverter : IValueConverter {
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
int val;
int.TryParse(value.ToString(), out val);
if (val < 100) {
return Brushes.Red;
} else if (val < 200) {
return Brushes.Orange;
} else if (val < 500) {
return Brushes.Yellow;
} else {
return Brushes.Green;
}
}
}
}
En I utilisé classe Window
les deux convertis comme suit:
<Window ...
x:Name="Main"
xmlns:Base="clr-namespace:InsightTool.Gui.Helper">
<Window.Resources>
<Base:ThreadsAvailableCountToColorConverter x:Key="ThreadsAvailableCntConverter"/>
<Base:AverageExecutionTimeToColorConverter x:Key="AvgExecutionTimeConverter"/>
</Window.Resources>
<!-- This one works fine-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ExecutionTimeAverage, Converter={StaticResource AvgExecutionTimeConverter}, ElementName=UCExecutionTimes}"/>
<!-- This one does not work-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource ThreadsAvailableCntConverter}, ElementName=Main}"/>
</Window>
Déclaration de DependencyProperties
:
public partial class UserControlExecutionTimes : UserControl {
public static readonly DependencyProperty ExecutionTimeAverageProperty =
DependencyProperty.Register("ExecutionTimeAverage", typeof(double), typeof(MainWindow), new FrameworkPropertyMetadata(double));
public double ExecutionTimeAverage {
get { return (double)GetValue(ExecutionTimeAverageProperty); }
set { SetValue(ExecutionTimeAverageProperty, value); }
}
}
public partial class MainWindow : Window {
public static readonly DependencyProperty ThreadsAvailableCountProperty = DependencyProperty.Register("ThreadsAvailableCount", typeof(int),
typeof(MainWindow), new FrameworkPropertyMetadata(int));
public int ThreadsAvailableCount {
get { return (int)GetValue(ThreadsAvailableCountProperty); }
set { SetValue(ThreadsAvailableCountProperty, value); }
}
}
Les deux DependencyProperties
sont définis correctement et leurs valeurs sont affichées dans l'interface graphique. Qu'est-ce qui me manque ici?
EDIT:
J'ai aussi testé les éléments suivants:
<Window>
<!-- This one works fine-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource AvgExecutionTimeConverter}, ElementName=Main}"/>
<!-- This one does not work-->
<TextBlock Width="10" Height="10" VerticalAlignment="Center" Background="{Binding ThreadsAvailableCount, Converter={StaticResource ThreadsAvailableCntConverter}, ElementName=Main}"/>
</Window>
Il semble qu'il y ait un problème pour le Binding
à consommer la valeur de retour du convertisseur « nouveau », mais je aucune idée pourquoi.
EDIT2
Je vérifie les liaisons avec Snoop et le résultat a été la suivante:
La propriété background
du look de liaison convertisseur de travail comme celui-ci:
Mais la background
propriété de la liaison de convertisseur ne fonctionne pas ressemble à ceci:
Une autre preuve que ThreadsAvailableCount
est correctement réglée (Reliure à Textblock
):
plus en plus semble être une erreur dans l'affichage de la valeur de retour de la ThreadsAvailableCountToColorConverter
. En effet, en mode débogage, il s'arrête à un point d'arrêt dans la méthode Convert
du ThreadsAvailableCountToColorConverter
. Il atteint même return
dans la méthode Convert
avec succès.
Avez-vous essayé de mettre un point d'arrêt dans la méthode Convert de ThreadsAvailableCountToColorConverter à voir si ça s'appelle. –
@ R.Rusev Il est appelé. J'ai déjà essayé, mais la couleur de fond de ce contrôle reste blanche – rbr94
Existe-t-il des exceptions ou des erreurs de liaison dans la fenêtre de sortie du débogueur? – haindl